Грааль 3: Перехватчики модульного тестирования: Не останавливается в перехватчике - PullRequest
0 голосов
/ 05 февраля 2019

В демонстрационных целях я установил приложение свежего грааля с этими файлами:

class HalloController {

    def index() {
        String heading = request.getAttribute("heading")
        render "${heading}"
    }
}
class HalloInterceptor {

    boolean before() {
        request.setAttribute("heading", "halloechen") // *** set breakpoint here***
        true
    }

    boolean after() { true }

    void afterView() {
        // no-op
    }
}

Когда я попал на http://localhost:8080/hallo, "halloechen" печатается, так как это было установлено какатрибут запроса в методе перехватчиков before(), как я и хотел.Теперь я хочу провести модульный тест для перехватчика:

class HalloInterceptorSpec extends Specification implements InterceptorUnitTest<HalloInterceptor> {

    def setup() {
    }

    def cleanup() {

    }

    void "Test hallo interceptor matching"() {
        when:"A request matches the interceptor"
            withRequest(controller:"hallo")

        then:"The interceptor does match"
            interceptor.doesMatch() && request.getAttribute("heading") == "halloechen"
    }
}

Этот тест не пройден, так как атрибут heading не установлен на запрос (который в любом случае является поддельным).Фактически, при запуске модульного теста кажется, что перехватчик даже не вызывается.Я установил точку останова в методе before(), и при отладке теста я никогда не доберусь до него.Что странно, потому что я ожидаю, что тест Перехватчика вызовет хотя бы перехватчик.Я знаю, что могу переписать тест, как описано здесь , но я хочу сказать, что перехватчик вообще не вызывается.Это правильно?Другое дело: вызов getModel() в тесте всегда возвращает null.Как мне получить модель в моем тесте?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Хитрость для меня заключалась в том, чтобы самому вызывать метод перехватчиков before():

import grails.testing.web.interceptor.InterceptorUnitTest
import spock.lang.Specification

class HalloInterceptorSpec extends Specification implements InterceptorUnitTest<HalloInterceptor> {

    def setup() {
    }

    def cleanup() {

    }

    void "Test hallo interceptor matching"() {
        when: "A request matches the interceptor"
        withRequest(controller: "hallo")
        interceptor.before()

        then: "The interceptor does match"
        interceptor.doesMatch() && request.getAttribute("heading") == "halloechen"
    }
}
0 голосов
/ 05 февраля 2019

Вам нужно использовать метод withInterceptors вместо withRequest - withRequest только проверяет соответствие или нет - таким образом, перехватчик фактически никогда не запускается.

Из документов:

withInterceptors:

Вы можете использовать метод withInterceptors для выполнения кода в контексте выполнения перехватчика.Обычно это делается для вызова действий контроллера, которые зависят от поведения перехватчиков .

https://testing.grails.org/latest/guide/index.html

...