我正在尝试在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'会话对象属性?
答案 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 */)
}
}