以下、ビューモデルパターンを尊重するためにコードを更新するまで、これまで正常に実行されていたテストメソッドがあります。ビューモデルをビューに渡すためにコードを更新した後、ユニットテストが失敗する
より前:エンティティモデルをパラメータとして持つ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));
}
すべてのヘルプは大歓迎です。
あなたは正しいです:これは問題です。さて、このコードをユニットテスト "Can_Save_Valid_Changes"に更新するにはどうしたらいいですか? – Bronzato
個人的には、セーブ機能をテストするための別の単体テストを作成することから始めます。たとえば、viewModelをモデルに変換し、モデルを保存し、保存が呼び出されたことを確認する単体テスト(つまり、他のものがない単体テスト)です。これがあなたの問題に直接対処するわけではないことは分かっていますが、あなたのプロジェクトについて多くのことを知らなくても、他に何か提案するのは難しいです。 –