5

統合テストでフィルターを使用するコントローラーをテストする方法はありますか?

単体テストに @Mock アノテーションを使用し、 withFilter クロージャーでコントローラー呼び出しをラップする方法があるようです。

しかし、統合テストでフィルターをテストすることはできません。これは、私の視点からは非常に簡単なはずです。

アップデート

だからここに私が見つけた解決策があります。@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()
        }
    }
}
4

1 に答える 1

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)
    }
}
于 2014-03-31T07:07:33.653 に答える