Session 集成测试期间未设置Grails会话对象属性
我正在尝试测试Grails2.2.1中的一个过滤器,它在有人点击我的应用程序中的任何URL时,在全局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
会话
对象中存储一个值。以下是我的想法,多亏了:
我可以看到过滤器通过在控制器方法中输出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 */)
}
}
有人在讨论:太棒了!谢谢分享这个链接。下面是一些人的讨论:太棒了!谢谢分享这个链接。