[英]How should I unit test a controller that returns a model?
我有一個名為PostsController
的控制器
public class PostsController : Controller
{
private readonly IPostsRepository repository;
public PostsController(IPostsRepository repository)
{
this.repository = repository;
}
public ViewResult Index()
{
var posts =
repository.All()
.OrderBy(post => post.PublishedAt);
return View("Index", posts.MapTo<PostViewModel>());
}
}
以及一個名為PostsControllerTest
的相應測試夾具
[TestFixture]
public class PostsControllerTest
{
private PostsController controller;
private Mock<IPostsRepository> repository;
[SetUp]
public void SetUp()
{
AutoMapperConfig.Configure();
repository = new Mock<IPostsRepository>();
controller = new PostsController(repository.Object);
}
[Test]
public void Index_ReturnsCorrectModel()
{
var actual = controller.Index().Model;
Assert.IsAssignableFrom<IEnumerable<PostViewModel>>(actual);
}
}
目前我只測試控制器返回正確的模型類型。 我是否還應該存儲存儲庫並測試返回正確的數據,如下所示:
[Test]
public void Index_ReturnsCorrectModel()
{
var post = new Post
{
Slug = "continuing-to-an-outer-loop",
Title = "Continuing to an outer loop",
Summary = "When you have a nested loop, sometimes",
Content = "When you have a nested loop, sometimes",
PublishedAt = DateTime.Now.AddDays(7),
Tags = new Collection<Tag> { new Tag { Name = "Programming" } }
};
repository.Setup(repo => repo.All()).Returns(new[] { post });
var actual = controller.Index().Model as IEnumerable<PostViewModel>;
Assert.NotNull(actual);
Assert.AreEqual(1, actual.Count());
Assert.AreEqual(post.Title, actual.First().Title);
}
我不知道自己是否正確進行單元測試,感到非常沮喪。 我明白我應該采取的明確解釋為什么會非常有幫助。
我不認為您需要在此單元測試中測試IPostRepository
的功能。 您應該為它創建一個單獨的單元測試類。
同樣,應單獨測試MapTo<T>
的功能。
單元測試應該只測試SUT(被測系統)的功能,在這種情況下,它是PostsController
類的Index
方法。
這是一個簡單的方法,因此您希望在此單元測試中驗證的兩件事是:
1- repository.All()
方法被調用一次
2-您的視圖模型已正確映射(您已經在進行)
這就是我對這種方法進行單元測試的方法:
[Test]
public void Index_ReturnsCorrectModel()
{
// Arrange
repository.Setup(repo => repo.All()).Returns(Enumerable.Empty<Post>());
// Act
var actual = controller.Index().Model;
// Assert
Assert.IsAssignableFrom<IEnumerable<PostViewModel>>(actual);
repository.Verify(repo => repo.All(), Times.Once);
}
此外,為了最大限度地減少安排單元測試所需的工作量,可以使用像AutoFixture這樣的庫,它會自動為您創建post對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.