2

ドキュメントによると、params をモックするだけで、コマンド オブジェクトを使用してコントローラーをテストでき ます。

これは、ネストされたコマンド オブジェクトに対して機能するのだろうか? 誰かがこれを機能させましたか?

例:

コントローラ

def create(FormCommand form){
  form.validate()
  ...
}

指示

class FormCommand {
  InnerCommand cmd
}

class InnerCommand{
  String x
  static constraints ={
     x(nullable: false)
  }
}

テスト

void testCreate(){
  params["inner.x"]="any"
  controller.create()
  ...
}

私の期待は、コマンド オブジェクトが作成され、データ バインディングが機能することです。また、内部コマンドが検証されることも期待しています。期待しすぎですか?

4

2 に答える 2

1

わかりました、それはあなたが望むことは可能だと思われますが、いくつかのコードが必要です:-)

データバインディング

ネストされたコマンド オブジェクトの場合、Grails のデータ バインディングには、内部コマンドの非 null インスタンスが必要です。

そのために、カスタムを作成できますorg.codehaus.groovy.grails.web.binding.BindEventListener

class InnerCommandBindEventListener împlements BindEventListener {
  public void doBind(Object target, MutablePropertyValues source, TypeConverter typeConverter) {
    target.cmd = new InnerCommand()
  }
}

そして、それをresources.groovyで宣言します

innerCommandBindEventListener(InnerCommandBindEventListener)

ネストされた検証

検証の問題を解決するには、コマンドのカスタム バリデーターが必要です。

class FormCommand {
  InnerCommand cmd
  static constraints = {
    cmd nullable: false, validator: { cmd, obj ->
      // manually trigger the inner command validation
      if(!cmd.validate()) {
        return 'invalid.innercommand.message' 
      }
    }
  }
}
于 2013-04-08T16:14:21.330 に答える
0

当面の問題に正確に適用できるかどうかはわかりませんが、少なくともコントローラーアクションのテストでのデータバインディングでは、これは機能します:

params.'player1.name' = "John"

これにより、ヌルポインター例外が発生します。

params.player1.name = "John"

コントローラーが実行しているとき:

Game game = new Game(params)

ゲームには次の機能があります。

Player player1
于 2014-07-20T11:01:55.480 に答える