モデルのインスタンスが見つからない場合に 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;
いくつかの例でほぼ同じコードを見たことがあるので、これは私の頭を悩ませます。
私が間違っていることはありますか?
編集:
問題は、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));
}