调用 属性 的 Lambda 最小起订量设置不正确

Incorrect setup in MOQ in the Lambda calling a property

最小起订量问题通常会让人们重新指向文档,这很酷,但我认为我需要一些帮助来理解这个错误的来源(也许我对 lambda 表达式的了解不足)

我有最小起订量测试

var mockTicket = new Mock<Ticket>();
        mockTicket.Setup(tix => tix.Total).Returns(var expectedResult = 5); 
        cashRegister.PendingTickets.Add(mockTicket.Object);


        //act 
        var actual = cashRegister.CloseTicket(mockTicket.Object);
        // FYI . close ticket returns the total of the tickets hence this is logical to the point that the 
        // ticket is the price being returned. 

        //assert
        Assert.Equals(actual, expectedResult);

我的错误是

System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member: tix => tix.Total

而且 Total 只是一个 get

       public decimal Total
    {
        get
        {
            return Decimal.Round(ItemsOrdered.Sum(x => x.Price + x.Tax), 2);
        }
    }

要进行模拟,您需要有一个 ITicket 接口来传递给您的方法,然后您的 cashRegister 不需要具体的 Ticket,您可以使用Total.

的已知良好价值

此外,您不需要在 return 中设置 var。您可以使用:

var mockTicket = new Mock<ITicket>();
mockTicket.Setup(tix => tix.Total).Returns(5);

此外,您需要更改 cashRegister.PendingTotalcashRegister.CloseTicket 以在签名中使用 ITicket 而不是 Ticket

或者,您可以安排一个具体的 Ticket class 到 return 一个已知的 Total 的好值。


此外,我不会更改 Ticket class 以在其上添加 virtual Total 属性,只是为了方便此测试,您将允许测试不必要地污染代码。