0

重複の可能性:
コントローラー内にあるコマンドオブジェクトをモックする方法

コントローラー クラスがあり、その中にコマンド オブジェクトがあります。次のように、このコマンド オブジェクトを使用するメソッド find() があります。

class RexController{

    //command object
    class SearchCommand{
        String email
        static constraints={
            email blank:false,email:true
        }

def find = {SearchCommand sc ->
    if(!sc.hasErrors()){
     ----- do something---
}

}

現在、コントローラーの find メソッドをテストするテスト ケースを作成しています。しかし、テストケースは失敗します

  if(!sc.hasErrors())

sc はまだ「null」であるためです。テスト ケースでこの内部クラス コマンド オブジェクトを処理する方法がわかりません。これまでに書いたテストケースは次のとおりです。

class itemControllerTests extends ControllerUnitTestCase {

    void testFind(){
    def model = controller.find()
    assertNotNull(model)
    }
}

テスト ケースで内部クラス Command Object を処理するにはどうすればよいですか。私はそれを嘲笑しますか?mockCommandObject(?) を使用してみましたが、内部クラスのコマンド オブジェクトをこれに渡す方法がわかりません。

テストケースでコントローラーのメタクラスプロパティを変更して、内部クラスを認識できるようにする必要があります。

4

1 に答える 1

0

Command インスタンスを作成/モックして、テストでコントローラー呼び出しに渡します。

void testFind() {
    def command = new RexController.SearchCommand(email: 'me@here.there')
    // or [email: 'me@here.there'] as RexController.SearchCommand
    def model = controller.find(command)
    assertNotNull(model)
}

mockCommandObject もう存在しません: 「アクションにコマンド オブジェクトが必要かどうかを Grails が自動的に検出するため、mockCommandObject() メソッドは不要になりました。」

ただし、UI に関連しないすべてのロジックを別の場所 (ドメイン クラスまたはサービス) に移動し、そのクラスをテストすることをお勧めします。

于 2012-08-27T16:36:40.503 に答える