c# - 如何模拟返回大量属性的获取函数?
问题描述
我对编写单元测试相当陌生,但了解它背后的一般想法以及我们为什么要这样做。我一直在寻找答案,因为我目前正在做的事情似乎有点麻烦。
相关信息:
- 使用最小起订量 V 4.16.0
- 使用工作单元/通用回购模式
- MVC 5.2.7
我的问题:
所以我面临的问题是可以说我有一个名为OrderService的“服务” 。假设这个服务有一个名为GetOrders()的函数,它查询数据库、将其转换为 VM 并返回所有订单数据。
我遇到的问题是我的视图模型有大约 20 多个属性,当尝试为此编写单元测试时,我认为我将不得不初始化每个变量。请参阅下面的代码。
获取订单:
public IEnumerable<OrderViewModel> GetOrders()
{
return _unitOfWork.OrderRepository.Get().Select(x => new OrderViewModel
{
ActualDraftingHours = x.ActualDraftingHours,
ActualEngineeredHours = x.ActualEngineeredHours,
CreatedAt = x.CreatedAt,
Comments = x.Comments,
CustomerId = x.CustomerId,
EstimatedCompletionDate = x.EstimatedCompletionDate,
EstimatedHours = x.EstimatedHours,
SalesOrderNumber = x.SalesOrderNumber,
EstimatedHoursChangedComment = x.EstimatedHoursChangedComment,
EstimatedHoursChanged = x.EstimatedHoursChanged,
PullUpDate = x.PullUpDate,
OrderTotal = x.OrderTotal,
EstimatedStartDate = x.EstimatedStartDate,
StatusId = x.StatusId,
PulledUp = !string.IsNullOrEmpty(x.PullUpComment),
RequestTypeId = x.RequestTypeId,
ScheduledById = x.ScheduledById,
ScheduledCompletionDate = x.ScheduledCompletionDate,
CheckedOutById = x.CheckedOutById,
PullUpComment = x.PullUpComment,
ActualCompletionDate = x.ActualCompletionDate,
Id = x.Id
}).ToList();
}
单元测试
[TestMethod]
public void TestGetOrders()
{
//Arrange
var now = DateTime.Now;
List<Order> MockScheduledOrders = new List<Order>(); //List of orders returned from repo
MockScheduledOrders.Add(new Order { ScheduledCompletionDate = now.AddDays(1),ActualDraftingHours = 5, ActualEngineeredHours = 6,.... });
MockScheduledOrders.Add(new Order { ScheduledCompletionDate = now.AddDays(2), ActualDraftingHours = 5, ActualEngineeredHours = 8, .... });
MockScheduledOrders.Add(new Order { ScheduledCompletionDate = now.AddDays(3), ActualDraftingHours = 4, ActualEngineeredHours = 6, .... });
MockScheduledOrders.Add(new Order { ScheduledCompletionDate = now.AddDays(4), ActualDraftingHours = 5, ActualEngineeredHours = 7, .... });
MockScheduledOrders.Add(new Order { ScheduledCompletionDate = now.AddDays(5), ActualDraftingHours = 9, ActualEngineeredHours = 2, .... });
MockScheduledOrders.Add(new Order { ScheduledCompletionDate = now.AddDays(5), ActualDraftingHours = 5, ActualEngineeredHours = 6, .... });
//var Expected = ...VM version of above
var unitOfWorkMock = new Mock<IUnitOfWork>();
unitOfWorkMock.Setup(x => x.OrderRepository.Get()).Returns(MockScheduledOrders).Verifiable();
IOrderService service = new OrderService(unitOfWorkMock.Object);
//Act
var actual = service.GetOrders();
//Assert
//For loop and assert that Expected[i].Property = MockScheduledOrders[i].property
}
基本上我要问的是是否有更好的方法来测试可能返回大量数据的 Get 函数?我只是这样做完全错误还是有一些可以推荐的最佳实践方法?我只是觉得为列表中的每个值初始化 20 多个属性似乎有点过分。
我想基本上测试每个属性都分配给 GetOrders 函数并在 GetOrders 函数中返回。任何关于一般实践或可用于帮助解决此类事情的工具的建议或建议都会很棒!
谢谢,
解决方案
我使用AutoFixture初始化测试数据,包括序列,然后使用CompareNETObjects来针对预期结果进行断言。两者都大大减少了进行测试所需的时间。
推荐阅读
- css - CSS中有幂函数吗?
- linux - 循环中的 bash 脚本,用于计算文件和目录的数量
- php - 我应该使用哪一个?
- java - 如何将新的集合名称单独添加到 Firestore
- python - How to change global values between classes in python
- r - 如何一次性停止R中所有(多个)执行的代码/命令行?
- excel - Using COUNTIF to count values with leading zeros
- javascript - 创建图像的幻灯片,其中图像每 5 秒更改一次
- angular - 使用 ngFor 进行多维数组迭代
- qt - 如何从另一个 qml 更改 QML 中的文本?