2012-10-04 109 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) 
    } 
} 
結束