2017-03-08 56 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