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

Session 集成测试期间未设置Grails会话对象属性,session,grails,spock,Session,Grails,Spock,我正在尝试测试Grails2.2.1中的一个过滤器,它在有人点击我的应用程序中的任何URL时,在全局会话对象中存储一个值。以下是我的想法,多亏了: 我可以看到过滤器通过在控制器方法中输出session.foo工作,但集成测试失败: package drummer import grails.plugin.spock.IntegrationSpec class QuestionControllerIntegrationSpec extends IntegrationSpec { de

我正在尝试测试Grails2.2.1中的一个过滤器,它在有人点击我的应用程序中的任何URL时,在全局
会话
对象中存储一个值。以下是我的想法,多亏了:

我可以看到过滤器通过在控制器方法中输出
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”会话对象属性呢?

之所以没有调用它,是因为过滤器不会在控制器测试中自动运行。如果您的过滤器位于service/util中,您可以为此编写单独的测试

Luke Daley写了一篇博客文章,内容是如果您想直接测试过滤器,请在此处创建集成测试:

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

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

Luke Daley写了一篇博客文章,内容是如果您想直接测试过滤器,请在此处创建集成测试:

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

有人在讨论:太棒了!谢谢分享这个链接。下面是一些人的讨论:太棒了!谢谢分享这个链接。