3

モデルのインスタンスが見つからない場合に HttpNotFoundResult が返されることをアサートするコントローラーの単体テストがあります。問題は、コントローラーの実際のコードが意図したとおりに機能していることですが、私の単体テストはそうではありません。ActionResult を HttpNotFoundResult としてキャストすると、null が返されるため、単体テストが失敗します。

コントローラーコード:

public ActionResult Delete(int? id)
        {
            if(id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Forum forum = forumRepository.GetForumById(id.GetValueOrDefault());
            if(forum == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.NotFound);
            }
            return View(forum);
        }

試験方法:

 [TestMethod]
        public void GetDeleteShouldReturn404IfForumNotFound()
        {
            // Arrange
            var forumRepository = Mock.Create<IForumRepository>();
            Mock.Arrange(() => forumRepository.GetForums())
                .Returns(new List<Forum>() {
                    new Forum { ForumId = 1, Title = "General Forum", Description = "Place to discuss general stuff", Sequence = 2 },
                    new Forum { ForumId = 2, Title = "Gaming", Description = "Let's talk about gaming", Sequence = 1 },
                    new Forum { ForumId = 3, Title = "Web Development", Description = "ASP.NET is pretty cool", Sequence = 3 }
                }).MustBeCalled();

            // Act
            ForumController controller = new ForumController(forumRepository);
            ActionResult result = controller.Delete(5) as HttpNotFoundResult;

            // Assert
            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(HttpNotFoundResult));
        }

Assert.IsNotNull は失敗します。私も同じ結果で次のことを試しました:

HttpNotFoundResult result = controller.Delete(5) as HttpNotFoundResult;

いくつかの例でほぼ同じコードを見たことがあるので、これは私の頭を悩ませます。

http://weblogs.asp.net/gunnarpeipman/archive/2010/08/15/asp-net-mvc-3-using-httpnotfoundresult-in-controller-tests.aspx

私が間違っていることはありますか?

編集:

問題は、GetForumById() をモックしていなかったことで、テスト コードを次のように変更するとうまくいきました。

[TestMethod]
        public void GetDeleteShouldReturn404IfForumNotFound()
        {
            // Arrange
            var id = 10;
            Forum forum = null;

            var forumRepository = Mock.Create<IForumRepository>();

            Mock.Arrange(() => forumRepository.GetForumById(id))
                .Returns(forum)
                .MustBeCalled();

            // Act
            ForumController controller = new ForumController(forumRepository);
            var result = controller.Delete(id) as HttpNotFoundResult;

            // Assert
            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(HttpNotFoundResult));
        }
4

1 に答える 1

2

これは、 HttpNotFoundResultがHttpStatusCodeResultから派生したものであり、その逆ではないためです。無効なダウンキャストを作成しているため、ステートメントは null を返します。as

于 2014-03-13T14:01:08.647 に答える