首页 > 解决方案 > 如何模拟返回大量属性的获取函数?

问题描述

我对编写单元测试相当陌生,但了解它背后的一般想法以及我们为什么要这样做。我一直在寻找答案,因为我目前正在做的事情似乎有点麻烦。

相关信息:

我的问题:

所以我面临的问题是可以说我有一个名为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 函数中返回。任何关于一般实践或可用于帮助解决此类事情的工具的建议或建议都会很棒!

谢谢,

标签: c#asp.netunit-testinginterfacemoq

解决方案


我使用AutoFixture初始化测试数据,包括序列,然后使用CompareNETObjects来针对预期结果进行断言。两者都大大减少了进行测试所需的时间。


推荐阅读