исключение Скажем, у меня есть следующий код:Модульное тестирование Grails контроллеры, которые используют декларативный обработку
class SomeController {
def fooService
def controllerMethod() {
def bar = fooService.doSomething()
// render bar to user - success case
}
def fooExceptionHandler(FooException e) {
// log, render error page, etc...
}
}
Основываясь на grails' new declarative controller exception handling mechanism, если fooService.doSomething()
бросает исключение, Grails будет вызывать fooExceptionHandler для меня. Отлично.
Теперь, когда я тестирую этот метод, (тестовый класс использует аннотацию @TestFor(SomeController)
), это не удастся сказать, что мы ожидали исключение FooException, но ничего не получили.
@Test(expected=FooException)
def doSomethingThrowsFooException() {
// override default service behavior, trigger a FooException
controller.fooService = [ doSomething: { throw new FooException() }]
controller.controllerMethod()
}
Однако, это работает:
@Test
def doSomethingThrowsFooException() {
// override default service behavior, trigger a FooException
controller.fooService = [ doSomething: { throw new FooException() }]
controller.controllerMethod()
assert response.json == false
}
Так что единственный способ проверить этот метод является утверждением, что ответ был, что, как ожидается, но из-за обработки декларативных исключений, эта логика сейчас где-то else (тестируется отдельно), а не в модуле кода, который я тестирую. Не следует ли проверять мой модуль только, чтобы исключение распространялось из метода контроллера?
Позвольте мне посмотреть, понимаю ли я. Перед обработкой описательных исключений мой контроллер помещает try/catch в сервисный вызов, а в catch я отображает страницу с ошибкой. Теперь, когда try/catch не нужен, вы говорите, что мне не нужно полностью тестировать этот путь? (Я понимаю, что вы говорите об модульном тестировании fooExceptionHandler) –