2013-04-18 48 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 */) 
    }  
}