einen Controller, wie dies mit einer einfachen Abfrage GORM Gegeben:Testing Grails-Controller, die @CurrentTenant verwenden
@CurrentTenant
class FooController {
def list() {
[foo: Foo.list()]
}
}
Und ein Spock Test wie folgt aus:
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
}
}
Ich würde erwarten, dass an Unit-Test-Controller, die die @CurrentTentant
Annotation verwenden.
Funktionell funktionierts, es zeigt nur Foo für die aktuellen Mieter, aber in dem Unit-Test erhalte ich eine Ausnahme:
org.grails.datastore.mapping.model.DatastoreConfigurationException: Current datastore [[email protected]] 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)
Gibt es eine Möglichkeit die aktuellen Datenspeicher für Multi-Tenancy zur Einrichtung in ein Komponententest mit einem Controller.
Ich habe versucht, das Setup von diesem Handbuch zu emulieren, aber sie sind auf einem GORM Datendienst http://guides.grails.org/discriminator-per-tenant/guide/index.html
Lösung
Ein Teil der Lösung unter Verwendung von @CurrentTenant war nur HibernateSpec zu verwenden, Allerdings musste ich auch die Datenquelle so konfigurieren, dass die DataSource in meiner Spezifikation als MultiTenant erkannt wurde:
@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"]
}
Und da unsere SystemPropertyTenantResolver
nur einen String setzen/setzen kann, musste ich meinen eigenen für den Test implementieren, der ein Long zurückgeben würde.
Sie sollten nicht DATATEST implementieren und erweitern HibernateSpec –
hatte ich die Einstellungen in application.groovy (nicht yml) und Es scheint, dass es einen Fehler in HibernateSpec gibt. Berichtet hier: https://github.com/grails/grails-data-mapping/issues/993 – erichelgeson