对于 returns View with ViewModel 的控制器操作方法,我到底应该测试什么

What exactly should I test for a controller action method that returns a View with ViewModel

我已经为使用 Moq 框架模拟存储库的控制器操作方法写下了我的第一个单元测试。在此测试中,我可以计算从模拟存储库返回的模型数量,但不知道我应该执行什么测试来验证视图模型或操作结果输出?

public class HomeControllerUnitTests
{
    [Fact]
    public void IndexTest()
    {
        //Arrange
        var restaurantServiceMock = new Mock<IRestaurantDataCL>();
        var mockList = new List<Restaurant>()
        {
            new Restaurant
            {
                Id = 1,
                Name = "Sabatino's",
                Cuisine = CuisineType.French
            },
            new Restaurant
            {
                Id = 2,
                Name = "Sabatino's",
                Cuisine = CuisineType.Italian
            },
            new Restaurant
            {
                Id = 3,
                Name = "Sabatino's",
                Cuisine = CuisineType.German
            },
            new Restaurant
            {
                Id = 4,
                Name = "Sabatino's",
                Cuisine = CuisineType.None
            },
            new Restaurant
            {
                Id = 5,
                Name = "Sabatino's",
                Cuisine = CuisineType.None
            }
        };

        restaurantServiceMock
            .Setup(x => x.GetAll())
            .Returns(mockList);

        var greeterServiceMock = new Mock<IGreeter>();
        var greeterMessage = "Hello From Unit Test !!!!";
        greeterServiceMock
            .Setup(x => x.GetMessageOfTheDay())
            .Returns(greeterMessage);


        var controller = new HomeController(restaurantServiceMock.Object, greeterServiceMock.Object);

        //act
        var result = controller.Index();

        //Assert
        Assert.NotNull(result);
        var okResult = result.Should().BeOfType<ViewResult>().Subject;
        var restaurants = ((HomeIndexViewModel)okResult.Model).Restaurants.Should().BeAssignableTo<IEnumerable<Restaurant>>().Subject;
        restaurants.Count().Should().Be(5);

        var indexViewModel = okResult.Model.Should().BeAssignableTo<HomeIndexViewModel>().Subject;

        Assert.IsAssignableFrom<HomeIndexViewModel>(indexViewModel);

    }
}

这取决于您的控制器操作应该执行的操作,但是您应该验证是否返回了正确的视图,是否返回了正确的视图模型并断言视图模型的预期状态。有关如何对控制器进行单元测试的更多信息,请参阅文档:

https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions-1/unit-testing/creating-unit-tests-for-asp-net-mvc-applications-cs

https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/testing?view=aspnetcore-2.1

请记住,控制器逻辑应该是最小的。您的业​​务逻辑应该在模型中实现。