2012-10-04 39 views
5

有没有办法测试在集成测试中使用过滤器的控制器?Grails集成测试过滤器

似乎有使用@Mock注释的单元测试和比包装上withFilter闭合,控制器调用的方法。

但我不能去上一个集成测试,从我的POV应该是很简单的测试过滤器。

更新

因此,这里是我找到了解决办法。我没有使用@Mock注释,而是实例化了FiltersUnitTestMixin类并用必要的值填充它。

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() 
     } 
    } 
} 

回答

1

我有同样的问题,我发现这 - >http://ldaley.com/post/392153102/integration-testing-grails-filters

并修改它适合我的需要与此

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) 
    } 
} 
结束