【发布时间】:2014-10-30 00:19:05
【问题描述】:
假设我有以下代码:
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
}
所以测试这个方法的唯一方法是断言响应是预期的,但是由于声明性异常处理,这个逻辑现在在其他地方(单独测试),而不是在我正在测试的代码单元中.我的单元测试不应该只验证异常是从控制器方法中传播出来的吗?
【问题讨论】:
标签: unit-testing grails