ASP.NET MVC-アクションメソッドロジックに応じて異なるビューを返すコントローラーをテストする

StackOverflow https://stackoverflow.com/questions/1820271

質問

コントローラーは、アクションメソッドロジックに応じて異なるビューを返すことができます。アクションメソッド '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));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top