2017-03-08 12 views
0

私はGrails 3.1.7をinbuilt spockで使用します。私は、ユニットテストの実行中にコントローラによってレンダリングされるサービスの戻り値をスタブすることに問題があるようです。サービスメソッドがnullを返した後、 "null"が返されたために "呼び出すメソッドを解決できません"というエラーをGroovyRuntimeExceptionがスローします。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にキャストできないというエラーが発生しました)。だから、相互作用は、いくつかの値をスタブとにかく、私はそれがnullをレンダリングしようとするかのように、コントローラの動作しようとしたほとんどのケースで戻るかもしれません:

groovy.lang.GroovyRuntimeException: 方法 grails.artefactのオーバーロードあいまいな方法を.controller.support.ResponseRenderer $ Trait $ Helper#render。 起因間 プロトタイプを重複する[クラス com.tempvs.controllers.AuthController、NULL]のために起動するためにどの方法で解決できません:[インターフェイス grails.artefact.controller.support.ResponseRenderer、インターフェース java.lang.CharSequence] [ com.tempvsの界面 grails.artefact.controller.support.ResponseRenderer、インターフェース java.util.Map] [インターフェイス grails.artefact.controller.support.ResponseRenderer、インターフェース org.grails.web.converters.Converter] .controllers.AuthController.register(AuthController.groovy:45) com.tempvs.controllers.AuthControllerSpec.Testing register() アクション(AuthControllerSpec.groovy:97)

私は何をやっているのですか?コントローラのレンダリングが失敗するのを避けるために模擬サービスオブジェクトがnull以外の値を返すようにするにはどうすればよいですか?

もっと情報が必要な場合は、できるだけ簡潔にしてください。前もって感謝します!

UPD 相互作用のために渡されたテスト:私は DEF JSONからAjaxResponseService#composeJsonResponse()戻り値の型を変更したとき

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

。しかし、私はテストのために嘲笑された共同作業者を使用し、明示的なタイプをサポートするにはどうすればいいのですか?

答えて

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 
関連する問題