调用 属性 的 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.PendingTotal
和 cashRegister.CloseTicket
以在签名中使用 ITicket
而不是 Ticket
。
或者,您可以安排一个具体的 Ticket
class 到 return 一个已知的 Total
的好值。
此外,我不会更改 Ticket
class 以在其上添加 virtual
Total
属性,只是为了方便此测试,您将允许测试不必要地污染代码。
最小起订量问题通常会让人们重新指向文档,这很酷,但我认为我需要一些帮助来理解这个错误的来源(也许我对 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.PendingTotal
和 cashRegister.CloseTicket
以在签名中使用 ITicket
而不是 Ticket
。
或者,您可以安排一个具体的 Ticket
class 到 return 一个已知的 Total
的好值。
此外,我不会更改 Ticket
class 以在其上添加 virtual
Total
属性,只是为了方便此测试,您将允许测试不必要地污染代码。