Unit testing 单元测试使用声明性异常处理的grails控制器
假设我有以下代码:Unit testing 单元测试使用声明性异常处理的grails控制器,unit-testing,grails,Unit Testing,Grails,假设我有以下代码: class SomeController { def fooService def controllerMethod() { def bar = fooService.doSomething() // render bar to user - success case } def fooExceptionHandler(FooException e) { // log, render error
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...
}
}
基于,如果fooService.doSomething抛出异常,grails将为我调用fooExceptionHandler。太好了
现在,当我对这个方法进行单元测试时,测试类使用@TestForSomeController注释,这将失败,因为我们预期会发生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
}
因此,测试此方法的唯一方法是断言响应是预期的,但由于声明性异常处理,现在在其他地方单独测试此逻辑,而不是在我正在测试的代码单元中。我的单元测试不应该只验证异常是从控制器方法传播出去的吗?如果可能的话,我会在集成测试中测试fooService与控制器的集成,但我认为这只有在功能测试中才能真正合理地测试。你真的在测试Grails——你在验证你的应用程序中是否发生了记录在案的行为 如果您添加一些代码来抛出异常,然后添加额外的代码来捕获异常并将其路由到处理程序,那么您只是在模仿Grails提供的东西。这方面的测试只是测试模拟代码,但与代码在生产环境中的工作情况无关
这里的单元测试机会在fooExceptionHandler中。如果出现异常,请进行测试,这样做是正确的。让我看看我是否理解。在声明性异常处理之前,我的控制器在服务调用周围放置了一个try/catch,并在catch中呈现了错误页面。既然不需要try/catch,您是说我根本不需要对这条路径进行单元测试吗?我确实理解你所说的单元测试fooExceptionHandler