对于 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/core/mvc/controllers/testing?view=aspnetcore-2.1
请记住,控制器逻辑应该是最小的。您的业务逻辑应该在模型中实现。
我已经为使用 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/core/mvc/controllers/testing?view=aspnetcore-2.1
请记住,控制器逻辑应该是最小的。您的业务逻辑应该在模型中实现。