2017-08-29 1 views
1

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.

+0

Sie sollten nicht DATATEST implementieren und erweitern HibernateSpec –

+0

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

Antwort

0

nicht umsetzen DataTest und Änderung:

void setupSpec() { 
    mockDomains Foo, Tenant 
} 

zu

List<Class> getDomainClasses() { [Foo, Tenant] } 
+0

Das brachte mich über das unmittelbare Problem hinaus und ich habe die passende Konfiguration hinzugefügt, die benötigt wird, um einen HibernateSpec MT zu machen. Vielen Dank! – erichelgeson