2011-11-09 4 views
1

以下、ビューモデルパターンを尊重するためにコードを更新するまで、これまで正常に実行されていたテストメソッドがあります。ビューモデルをビューに渡すためにコードを更新した後、ユニットテストが失敗する

より前:エンティティモデルをパラメータとして持つEditProjectアクションメソッドがありました。テストには問題はありませんでした。以下のコードを参照してください(d)。

これは、エンティティモデルを自分のビューに渡すことはお勧めできませんでした。そこでビューモデルのみをビューに渡すためにコードを更新しました(私はAutomapperを使用します)。

コントローラコードを更新した後:EditProjectアクションメソッドは、ビューモデルパラメータで機能します。ウェブサイトを実行しても動作しますが、テストメソッドが失敗します。

私の元のテスト方法は以下の通りです。

[TestMethod] 
public void Can_Save_Valid_Changes() 
{ 
    // (a) Arrange - create mock repository 
    Mock<IProductRepository> mock = new Mock<IProductRepository>(); 

    // (b) Arrange - create the controller 
    AdminController target = new AdminController(mock.Object); 

    // (c) Arrange - create a product 
    Product product = new Product {Name = "Test"}; 

    // (d) Act - try to save the product 
    ActionResult result = target.Edit(product); 

    // (e) Assert - check that the repository was called 
    mock.Verify(m => m.SaveProduct(product)); 

    // (f) Assert - check the method result type 
    Assert.IsNotInstanceOfType(result, typeof(ViewResult)); 
} 

私のテスト方法を変更する必要はありません。私はテストメソッドを更新して、モデルからviewModelへのマッピングを追加しようとしますが、失敗します(h2行で失敗します)。エラー:mockの呼び出しが少なくとも1回は実行されましたが、実行されませんでした。m => m.SaveProject(.model) 設定が構成されていません。

public void Can_Save_Valid_Changes() 
    { 
     // (a2) Arrange - create mock repository 
     Mock<IProjectRepository> mock = new Mock<IProjectRepository>(); 

     // (b2) Arrange - create the controller 
     AdminController target = new AdminController(mock.Object); 

     // (c2) Arrange - create a product 
     Project project = new Project { ProjectID = 1, Name = "Test" }; 

     // (d2) Create the maps 
     Mapper.CreateMap<Project, ProjectViewModel>(); 
     Mapper.CreateMap<ProjectViewModel, Project>(); 

     // (e2) Map model into view model 
     ProjectViewModel viewModel = Mapper.Map<Project, ProjectViewModel>(project); 

     // (f2) Act - try to save the product 
     ActionResult result = target.EditProject(viewModel); 

     // (g2) Map view model into model 
     Project model = Mapper.Map<ProjectViewModel, Project>(viewModel); 

     // (h2) Assert - check that the repository was called 
     mock.Verify(m => m.SaveProject(model)); 

     // (i2) Assert - check the method result type 
     Assert.IsNotInstanceOfType(result, typeof(ViewResult)); 
    } 

すべてのヘルプは大歓迎です。

答えて

0

元の例では、手順(d)と(e)で動作した製品オブジェクトが同じオブジェクトであり、保存操作が検出されたためです。

しかし、リファクタリングされたバージョンでは、別のオブジェクトで動作しています。 viewModel(e2)を作成し、それをコントローラー(f2)に渡し、コントローラー内でviewModelをモデルに変換して保存しましたが、そのモデルはではありません。ではありません。実行される。代わりに、ステップh2で、保存操作が呼び出されていないg2で作成された新しいモデルオブジェクトを使用しています。

+0

あなたは正しいです:これは問題です。さて、このコードをユニットテスト "Can_Save_Valid_Changes"に更新するにはどうしたらいいですか? – Bronzato

+0

個人的には、セーブ機能をテストするための別の単体テストを作成することから始めます。たとえば、viewModelをモデルに変換し、モデルを保存し、保存が呼び出されたことを確認する単体テスト(つまり、他のものがない単体テスト)です。これがあなたの問題に直接対処するわけではないことは分かっていますが、あなたのプロジェクトについて多くのことを知らなくても、他に何か提案するのは難しいです。 –

関連する問題