Свойство объекта сеанса Grails не устанавливается во время теста интеграции

62
6

Я пытаюсь протестировать фильтр в Grails 2.2.1, который хранит значение в глобальном объекте session любое время, когда кто-то удаляет любой URL-адрес в моем приложении. Вот что я придумал, благодаря этому прекрасному сообщению:

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 в тесте интеграции?

спросил(а) 2013-04-19T00:03:00+04:00 7 лет, 12 месяцев назад
1
Решение
63

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

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 */)
}
}

ответил(а) 2014-05-08T19:13:00+04:00 6 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема