2012-10-04 12 views
5

Gibt es eine Möglichkeit, einen Controller zu testen, der einen Filter für einen Integrationstest verwendet?Grails Integrationstestfilter

Es scheint eine Möglichkeit zu geben, die @Mock-Annotation für Komponententests zu verwenden und den Controlleraufruf mit einem withFilter-Abschluss zu versehen.

Aber ich kann Filter auf einem Integrationstest nicht bekommen, der von meinem pov sehr geradlinig sein sollte.

aktualisieren

So, hier ist die Lösung, die ich gefunden. Anstatt die Annotation @Mock zu verwenden, habe ich die FilterUnitTestMixin-Klasse instanziiert und mit den erforderlichen Werten gefüllt.

public class ControllerTest { 

    def controller = new Controller() 
     FiltersUnitTestMixin f = new FiltersUnitTestMixin() 

    @Before 
    public void setup() { 
     f.grailsApplication = grailsApplication 
     f.applicationContext = grailsApplication.mainContext 
     f.mockFilters(ControllerFilters) 
    } 

    @Test 
    public void shouldPassTheTest() { 
     f.withFilters(action:"actionName") { 
      controller.actionName() 
     } 
    } 
} 

Antwort

1

ich das gleiche Problem hatte, fand ich diese ->http://ldaley.com/post/392153102/integration-testing-grails-filters

und modifizierte es meine Bedürfnisse mit diesem

import grails.util.GrailsWebUtil 
import org.junit.After 
import org.junit.Before 
import org.junit.Test 

class SomethingIntegrationTests { 

    def filterInterceptor 
    def grailsApplication 
    def grailsWebRequest 

    @Before 
    void setUp() { 

    } 

    @After 
    void tearDown() { 

    } 

    @Test 
    void testFilterRedirects() { 

     def result = request("home", "index", someParameter: "2") 
     assert !result 
     assert response.redirectedUrl.endsWith(/* something */) 
    } 

    def getResponse() { 
     grailsWebRequest.currentResponse 
    } 

    def request(Map params, controllerName, actionName) { 
     grailsWebRequest = GrailsWebUtil.bindMockWebRequest(grailsApplication.mainContext) 
     grailsWebRequest.params.putAll(params) 
     grailsWebRequest.controllerName = controllerName 
     grailsWebRequest.actionName = actionName 
     filterInterceptor.preHandle(grailsWebRequest.request, grailsWebRequest.response, null) 
    } 
} 
Endung anzupassen