首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试使用@CurrentTenant的Grails控制器

测试使用@CurrentTenant的Grails控制器
EN

Stack Overflow用户
提问于 2017-08-29 01:28:01
回答 1查看 381关注 0票数 3

给定这样的控制器,只需简单的GORM查询:

代码语言:javascript
复制
@CurrentTenant
class FooController {
    def list() {
        [foo: Foo.list()]
    }
}

像这样的斯波克测试:

代码语言:javascript
复制
class FooControllerSpec
    extends HibernateSpec
    implements ControllerUnitTest<FooController>, DataTest {

    Tenant tenant

    void setupSpec() {
        mockDomains Foo, Tenant
    }

    @Override
    Map getConfiguration() {
        [(Settings.SETTING_MULTI_TENANT_RESOLVER_CLASS):  SystemPropertyTenantResolver]
    }

    def setup() {
        tenant = new Tenant(name: "test").save(flush:true)
        System.setProperty(SystemPropertyTenantResolver.PROPERTY_NAME, tenant.id.toString())
        controller.transactionManager = transactionManager // For HibernateSpec in a controller
    }

    void "list"() {
        when:
        controller.list()

        then:
        response.status == 200
    }
}

我希望能够使用@CurrentTentant注释的单元测试控制器。

在功能上,它只显示当前租户的Foo,但是在单元测试中我得到了一个异常:

代码语言:javascript
复制
org.grails.datastore.mapping.model.DatastoreConfigurationException: Current datastore [org.grails.datastore.mapping.simple.SimpleMapDatastore@370c9018] is not configured for Multi-Tenancy

    at org.grails.datastore.gorm.services.DefaultTenantService.withCurrent(DefaultTenantService.groovy:74)
    at com.foo.web.FooControllerSpec.show with no id(FooControllerSpec.groovy:39)

是否有一种方法可以在带有控制器的单元测试中设置多租户的当前数据存储。

我试图模仿本指南中的设置,但他们在GORM数据服务http://guides.grails.org/discriminator-per-tenant/guide/index.html上使用@CurrentTenant

溶液

解决方案的一部分是只使用HibernateSpec,但是我还必须配置数据源,以便在规范中使datasource成为MultiTenant:

代码语言:javascript
复制
@Override
Map getConfiguration() {
    [(Settings.SETTING_MULTI_TENANT_RESOLVER_CLASS): SystemPropertyLongTenantResolver,
     (Settings.SETTING_MULTI_TENANCY_MODE): 'DISCRIMINATOR',
     (org.grails.orm.hibernate.cfg.Settings.SETTING_DB_CREATE): "create-drop"]
}

由于我们的SystemPropertyTenantResolver只能设置/获取一个字符串,所以我必须为返回一个Long的测试实现自己的字符串。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-30 20:52:25

不要实现DataTest和更改:

代码语言:javascript
复制
void setupSpec() {
    mockDomains Foo, Tenant
}

代码语言:javascript
复制
List<Class> getDomainClasses() { [Foo, Tenant] }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45929410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档