测试使用 @CurrentTenant 的 Grails 控制器
Testing Grails controllers that use @CurrentTenant
给定这样一个带有简单 GORM 查询的控制器:
@CurrentTenant
class FooController {
def list() {
[foo: Foo.list()]
}
}
还有像这样的 Spock 测试:
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,但在单元测试中我得到一个异常:
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 数据服务上使用@CurrentTenant http://guides.grails.org/discriminator-per-tenant/guide/index.html
解决方案
部分解决方案是仅使用 HibernateSpec,但是我还必须配置数据源,以便让数据源在我的规范中支持多租户:
@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
只能 set/get 一个字符串,所以我必须自己实现一个 return 一个 Long.
的测试
不实施 DataTest
并更改:
void setupSpec() {
mockDomains Foo, Tenant
}
至
List<Class> getDomainClasses() { [Foo, Tenant] }
给定这样一个带有简单 GORM 查询的控制器:
@CurrentTenant
class FooController {
def list() {
[foo: Foo.list()]
}
}
还有像这样的 Spock 测试:
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,但在单元测试中我得到一个异常:
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 数据服务上使用@CurrentTenant http://guides.grails.org/discriminator-per-tenant/guide/index.html
解决方案
部分解决方案是仅使用 HibernateSpec,但是我还必须配置数据源,以便让数据源在我的规范中支持多租户:
@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
只能 set/get 一个字符串,所以我必须自己实现一个 return 一个 Long.
不实施 DataTest
并更改:
void setupSpec() {
mockDomains Foo, Tenant
}
至
List<Class> getDomainClasses() { [Foo, Tenant] }