【问题标题】:Parameter count mismatch in Unit test单元测试中的参数计数不匹配
【发布时间】:2018-01-16 06:46:35
【问题描述】:

我得到了

参数计数不匹配。

尝试运行以下单元测试时出现异常。我正在传递相关参数并且计数是正确的。为什么会抛出异常?

List<TransactionVM> transactionList = new List<TransactionVM> {
    new TransactionVM {OrderDetailID = 1, QuantityReceived=125, UnitCost=100.00},
    new TransactionVM {OrderDetailID = 1, QuantityReceived=130, UnitCost=200.00},
};

public OrderServiceTest()
{
    Mock<IOrderManager> mockOrderManager = new Mock<IOrderManager>();
    mockOrderManager.Setup(mr => mr.Receive(It.IsAny<List<TransactionVM>>(), It.IsAny<string()))
                    .Returns((TransactionVM target) =>
                             {
                                 target.RoleID = transactionList.Count() + 1;
                                 transactionList.Add(target);
                                 return "OrderReceived";
                             });
    this.MockOrderManager = mockOrderManager.Object;
}

[TestMethod]
public void CanReceiveOrder()
{
    List<TransactionVM> transactionList = new List<TransactionVM> {
        new TransactionVM {OrderDetailID = 1, QuantityReceived=125, UnitCost=100.00}
    };

    this.MockOrderManager.Receive(transactionList, "Permanent");
    int productCount = transactionList.Count();
    Assert.AreEqual(3, transactionList);
}

界面中的签名

string Receive(List<TransactionVM> transactionVMList, string priceChangeStatus);

当我在CanReceiveOrder() 中执行this.MockOrderManager.Receive(transactionList, "Permanent"); 行时出现异常

【问题讨论】:

    标签: c# unit-testing parameter-passing


    【解决方案1】:

    在您进行设置时,您的 .Returns() 方法似乎没有实现正确的签名(因此出现“不匹配”错误)。

    .Returns() 方法必须采用与Receive() 方法签名相匹配的 lambda 函数。然后您可以访问调用模拟对象时使用的参数,这些参数通常会确定返回值。

    试试这个:

    mockOrderManager.Setup(mr => mr.Receive(It.IsAny<List<TransactionVM>>(), It.IsAny<string()))
                    .Returns((List<TransactionVM> target, string status) =>
                             {
                                 // update logic here...
                                 // target.RoleID = transactionList.Count() + 1;
                                 // transactionList.Add(target);
                                 return "OrderReceived";
                             });
    

    更大的问题是,您看起来像是在测试您的模拟,而不是您的业务对象。您的测试类名为OrderServiceTest,但您从未创建订单服务。

    我对创建单元测试的建议是使用“应该”命名约定和“AAA”(排列、动作、断言)布局。这是一个基于您的问题的示例:

    [TestMethod]
    public void OrderService_ShouldReceiveOrder()
    {
        // Arrange
        var mockOrderManager = new Mock<IOrderManager>();
        mockOrderManager.Setup(It.IsAny<List<TransactionVM>>(), "Permanent")
                        .Returns("OrderReceived");
    
        var orderService = new OrderService(mockOrderManager.Object);
        orderService.AddOrder(new TransactionVM());
    
        // Act
        orderService.ProcessOrders();
    
        // Assert
        mockOrderManager.Verify(_ => _.Receive(It.IsAny<List<TransactionVM>>(),
                                               "Permanent"));
    }
    

    我认为这很清楚您正在测试什么,以及您希望您的测试做什么。

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 2020-02-13
      • 2022-12-08
      • 2016-09-21
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 2017-05-15
      • 2011-02-10
      相关资源
      最近更新 更多