2013-04-18 35 views
1

我试图在Grails 2.2.1中测试过滤器,该过滤器在任何时候有人在我的应用程序中点击任何URL时将值存储在全局对象session中。以下是我想出了,这要归功于this fine post在集成测试期间未设置Grails会话对象属性

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

这里的那某人disccusion:HTTPS://www.evernote.com/shard/ s209/sh/e2d21b27-2f4a-409a-891b-400e71a3236a/4b2dda3166be76a67bc070bffd49f5d3 –

+0

太棒了!感谢您分享该链接。 – bonh

回答

1

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

卢克·戴利写了一篇博客文章上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 */) 
    }  
}