3

私はProductControllerクラスとProductモデルを持っています。毎回ProductControllerCreateアクションが呼ばれ、それがFormCollectionに基づいて新しいProductを作成し、それが日付を変更するProduct内の関数を呼び出します。Asp.net MVC 3のユニットテストモデルの変更

[HttpPost] 
public ActionResult Create(FormCollection form) 
{ 
    Product product = new Product(); 
    TryUpdateModel(product, form); 

    if(ModelState.IsValid) 
    { 
     product.ChangeDate(form["date"]); 
     repository.SaveProduct(product); 

     return RedirectToAction("Index"); 
    } 
    else 
     return View(); 
} 

私はそうProductをテストすることができますどのように思っていた私が知っている.ChangeDate (MoqのVerify経由で)呼び出されています。私はTryUpdateModel経由でバインディング例外をキャッチしたいので、私はAsp.Net自動モデルバインドを使用しませんでした。コントローラまたはリポジトリクラスに.ChangeDateを入れるべきかどうかはわかりません。私はMoq、MVC3、Entity Framework 4を使用しています。

セットアップそれは、特定の引数で呼び出されるように嘲笑リポジトリのSaveProduct方法に期待をすることができますおかげで、 アレックス

答えて

3

。この特定の議論は、コントローラアクションの内部に構築された製品である。次に、このオブジェクトのDateプロパティが、フォームコレクション内のCreateアクションの引数として渡したものと同じであることをアサートできます。

var mock = new Mock<IRepository>(); 
mock.Setup(
    x => x.SaveProduct(
     It.Is<Product>(p => p.Date == someExpectedDate) 
    ) 
); 
+0

ありがとう、ダーリン。私はそれを考えなかった!複数の期待を設定する方法はありますか?では、Dateだけでなく、将来の参照のためにちょうど疑問に思っています... – Alex

+0

@Alex、確かに: 'p.Date == someExpectedDate && p.Foo ==" bar "&& ...' –