我有一个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语法的有效用法,那么为什么第一个失败而第二个失败?
干杯,
答案 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()
}
}