在集成测试期间未设置Grails会话对象属性

时间:2013-04-18 21:03:38

标签: session grails spock

我正在尝试在Grails 2.2.1中测试一个过滤器,该过滤器会在有人点击我的应用程序中的任何URL时在全局session对象中存储一个值。以下是我提出的问题,感谢this fine post

package drummer

class SessionExpirationFilters {

    def filters = {
        all(controller: '*', action: '*') {
            before = {
                session.foo = 'bar'
            }
        }
    }
}

我能够通过在控制器方法中输出session.foo来看到过滤器的工作原理,但集成测试失败了:

package drummer

import grails.plugin.spock.IntegrationSpec

class QuestionControllerIntegrationSpec extends IntegrationSpec {

    def 'filter sets session foo to bar'() {
        given:
        def controller = new QuestionController()

        when:
        controller.list()

        then:
        assert 'bar' == controller.session.foo // fails, session.foo is null
    }
}

那么为什么在集成测试中没有设置'foo'会话对象属性?

1 个答案:

答案 0 :(得分:1)

它未被调用的原因是因为过滤器不会在控制器测试中自动运行。如果您的过滤器位于service / util中,则可以为其编写单独的测试。

如果您想直接测试过滤器,Luke Daley写了一篇关于为filters创建集成测试的博客文章:

import grails.util.GrailsWebUtil

class MyFilterTests extends GroovyTestCase {
    def filterInterceptor
    def grailsApplication
    def grailsWebRequest

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

    def getResponse() {
        grailsWebRequest.currentResponse
    }

    def testFilterRedirects() {
        def result = request("home", "index", someParameter: "2")
        assertFalse result
        assertTrue response.redirectedUrl.endsWith(/* something */)
    }    
}