私は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)
。しかし、私はテストのために嘲笑された共同作業者を使用し、明示的なタイプをサポートするにはどうすればいいのですか?
回答ありがとうございますが、JSONオブジェクトの嘲笑がかなりうまくいくようでした:) –