使用GMock的模拟服务测试Grails控制器(0.8.0)

时间:2012-12-19 09:37:01

标签: unit-testing grails groovy gmock

我有一个grails 2.1 app,它有一个控制器,可以调用服务上的方法,传入请求和响应:

class FooController {
    def myService
    def anAction() {
        response.setContentType('text/xml')
        myservice.service(request,response)
}

我想对这种方法进行单元测试。我想使用GMock(版本0.8.0)这样做,所以这就是我尝试过的:

def testAnAction() {
    controller.myService = mock() {
        service(request,response).returns(true)
    }
    play {
        assertTrue controller.anAction()
    }
}

现在,这说明它失败了对请求的期望。

Missing property expectation for 'request' on 'Mock for MyService'

但是,如果我像这样编写测试:

def testAnAction() {
    def mockService = mock()
    mockService.service(request,response).returns(true)
    controller.myService = mockService
    play {
        assertTrue controller.anAction()
    }
}

测试将顺利通过。据我所知,它们都是GMock语法的有效用法,那么为什么第一个失败而第二个失败?

干杯,

1 个答案:

答案 0 :(得分:3)

我假设您在Grails生成的测试类FooControllerTest中编写测试。

以这种方式,FooControllerTest类由@TestFor(FooController)注释,注入一些有用的属性

因此request是测试类的属性,而不是本地范围内的变量

这就是为什么它无法从内部Closure到达。

我确信以下代码可以正常工作(我还没有测试过):

def testAnAction() {
    def currentRequest = request
    def currentResponse = response
    controller.myService = mock() {
        service(currentRequest,currentResponse).returns(true)
    }
    play {
       assertTrue controller.anAction()
    }
}