2014-10-30 1 views
0

исключение Скажем, у меня есть следующий код:Модульное тестирование 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 (тестируется отдельно), а не в модуле кода, который я тестирую. Не следует ли проверять мой модуль только, чтобы исключение распространялось из метода контроллера?

ответ

0

Я бы протестировал интеграцию fooService с вашим контроллером в интеграционном тесте, если это возможно, но я думаю, что это действительно разумно проверить в функциональном тесте. Вы действительно проверяете Grails - вы проверяете, что документальное поведение происходит в вашем приложении.

Если вы добавите какой-то код, чтобы выбросить исключение, а затем дополнительный код, чтобы поймать его и перенаправить на обработчик, вы просто издеваетесь над тем, что предоставляет Grails. Тесты на это просто проверяют ваш издевательский код, но имеют мало общего с тем, насколько хорошо ваш код будет работать на производстве.

Вариант испытания блока здесь находится внутри fooExceptionHandler. Испытайте, что с учетом исключения, вы поступаете правильно с ним.

+0

Позвольте мне посмотреть, понимаю ли я. Перед обработкой описательных исключений мой контроллер помещает try/catch в сервисный вызов, а в catch я отображает страницу с ошибкой. Теперь, когда try/catch не нужен, вы говорите, что мне не нужно полностью тестировать этот путь? (Я понимаю, что вы говорите об модульном тестировании fooExceptionHandler) –

Смежные вопросы