ASP.NET MVC-アクションメソッドロジックに応じて異なるビューを返すコントローラーをテストする
-
10-07-2019 - |
質問
コントローラーは、アクションメソッドロジックに応じて異なるビューを返すことができます。アクションメソッド 'Create'は、サービスにいくつかの検証と永続化を要求します。検証に失敗した場合、アクションメソッドは同じ「作成」ビューを返します。検証と保存が正常に実行されると、アクションメソッドは「インデックス」ビュー(RedirectToAction)を返します。 次のようにビュー名を明示的に指定した場合にのみ、ビュー名を取得できることを知っています:
return View("Create", data);
テストのためだけにビュー名をハードコーディングしたくはありませんが、返されたビューを見つける方法がわかりません。アクションメソッドのロジックに応じて、どのビューが返されたかをテストするためのクリーンでエレガントな方法はありますか?
ところで、これが私のテストコードです。
[TestMethod]
public void Create_Post_Should_Return_Create_View_When_Saving_Invalid_Court() {
var courtServiceMock = new Mock<ICourtService>();
var userServiceMock = new Mock<IUserService>();
courtServiceMock.Setup(x => x.Add(It.IsAny<CourtInfo>())).Returns((int?)null);
userServiceMock.Setup(x => x.Get(It.IsAny<string>(), It.IsAny<UserLoadOptions>())).Returns(new UserInfo { Id = 1 });
var controller = new CourtsController(courtServiceMock.Object, userServiceMock.Object);
var controllerContextMock = new Mock<ControllerContext>();
controllerContextMock.SetupGet(x => x.HttpContext.User.Identity.Name).Returns("admin");
controller.ControllerContext = controllerContextMock.Object;
var view = controller.Create(new CourtInfo()) as ViewResult;
Assert.IsTrue(view.ViewName == "Create"); //this line is not working
}
解決
ビューの名前ではなく、結果のタイプをテストする必要があります。リダイレクトすると、結果はとにかく ViewResult
になりません。
エラーが発生した場合にRedirectToActionを返す場合、次のようなテストを実行します。
// setup for success
var result = controller.Create(new CourtInfo());
Assert.IsInstanceOfType(result, typeof(ViewResult));
エラーテスト:
// setup for error
var result = controller.Create(new CourtInfo());
Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
所属していません StackOverflow