簡體   English   中英

我應該如何對返回模型的控制器進行單元測試?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM