2013-04-18 2 views
1

Я пытаюсь протестировать фильтр в Grails 2.2.1, который хранит значение в глобальном объекте session в любое время, когда кто-то удаляет любой URL-адрес моего приложения. Вот что я придумал, благодаря 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» session в тесте интеграции?

+0

Вот кому-то disccusion этого: https: //www.evernote.com/shard/ s209/sh/e2d21b27-2f4a-409a-891b-400e71a3236a/4b2dda3166be76a67bc070bffd49f5d3 –

+0

Удивительный! Спасибо, что поделились этой ссылкой. – bonh

ответ

1

Причина, по которой он не вызывается, заключается в том, что фильтры НЕ запускаются автоматически в тестах контроллера. Если ваш фильтр находится в сервисе/утилите, вы можете написать для этого отдельные тесты.

Люк 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 */) 
    }  
} 
Смежные вопросы