2017-03-08 14 views
0

我使用内置spock的Grails 3.1.7。它看起来像是在单元测试执行过程中遇到由控制器呈现的服务返回值的问题。 Service方法返回null,然后控制器抛出一个GroovyRuntimeException,由于返回“null”,抱怨“无法解析调用哪个方法”。Spock - 剔除JSON响应

控制器的动作码的样品:测试套件代码的

JSON composeJsonResponse(instance, String successMessage = null) { 
    //some logic 
    [success: success, messages: messages] as JSON 
} 

零件::

//field definitions 
def requestRegistrationCommand = Mock(RequestRegistrationCommand) 
def ajaxResponseService = Mock(AjaxResponseService) 

def setup() { 
    controller.ajaxResponseService = ajaxResponseService 
    ..... 
} 

void "Testing register() action"() { 
    when: 'Passing invalid register params' 
    ... 
    params.email = INVALID_EMAIL 
    controller.register(requestRegistrationCommand) 

    then: 'JSON response returned' 
    ... 
    1 * ajaxResponseService.composeJsonResponse(requestRegistrationCommand) >> [asd:123] as JSON //tried plenty of things here 
} 

有趣的

def register(RequestRegistrationCommand rrc) { 
    //some logic 
    render ajaxResponseService.composeJsonResponse(rrc) 
} 

的服务的方法的代码的示例是交互本身被触发(通过替换为“0 * _”来检查,并且还将“1 * ajaxR .. 。>>'asd'“得到一个错误,该字符串不能被转换成JSON)。因此,互动可能有,我试图控制器的行为就好像它试图使空大多数情况下,返回一些存根值,但无论如何:

groovy.lang.GroovyRuntimeException:不明确的方法重载的 方法 grails.artefact .controller.support.ResponseRenderer $特质$助手#渲染。 无法解析调用为[类 com.tempvs.controllers.AuthController,空]该方法由于之间的重叠 原型:接口 grails.artefact.controller.support.ResponseRenderer,接口 java.lang.CharSequence中] [接口 grails.artefact.controller.support.ResponseRenderer,接口 java.util.Map] [接口 grails.artefact.controller.support.ResponseRenderer,接口 org.grails.web.converters.Converter]在 com.tempvs .controllers.AuthController.register(AuthController.groovy:45) at com.tempvs.controllers.AuthControllerSpec.Testing register() action(AuthControllerSpec.groovy:97)

我在做什么错,我应该如何强制mocked服务对象返回非空值以避免控制器呈现失败?

如果需要更多信息,请通知我,我尽量简短。提前致谢!

UPD 测试结果通过对相互作用:

1 * ajaxResponseService.composeJsonResponse(requestRegistrationCommand) >> Mock(JSON) 

当我从改变AjaxResponseService#composeJsonResponse()返回类型JSONDEF。但是来吧,我只用一个嘲弄的合作者进行测试,我该如何强制它支持显式类型?!?!

回答

1

应该使用一个封闭你的返回值:

1 * ajaxResponseService.composeJsonResponse(requestRegistrationCommand) >> { [asd:123] as JSON } 

见(指节上的返回值):

http://spockframework.org/spock/docs/1.1-rc-3/interaction_based_testing.html

您可以只包住回报括号:

1 * ajaxResponseService.composeJsonResponse(requestRegistrationCommand) >> ([asd:123] as JSON) 
+0

感谢您的答案,但似乎嘲笑的JSON对象是足够的,使其工作:) –

0

其实我是通过嘲笑回归来解决的n值:

def json = Mock(JSON) 
.... 
1 * ajaxResponseService.composeJsonResponse(requestRegistrationCommand) >> json