2

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

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 语法的有效用法,那么为什么第一个失败而第二个没有呢?

干杯,

4

1 回答 1

3

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

通过这种方式,FooControllerTest类通过@TestFor(FooController)注入一些有用的属性来注释。

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

这就是为什么它不能从内部闭包访问的原因。

我确信以下代码可以工作(我尚未测试):

def testAnAction() {
    def currentRequest = request
    def currentResponse = response
    controller.myService = mock() {
        service(currentRequest,currentResponse).returns(true)
    }
    play {
       assertTrue controller.anAction()
    }
}
于 2013-01-02T23:41:13.920 回答