[英]Why in the world is this Moq + NUnit test failing?
我有这个dataAccess模拟对象,并且我试图验证其方法之一正在被调用,并且传递给此方法的参数满足某些约束。 据我所知,此方法确实已被调用,并且满足了约束条件。 该行测试抛出MockException:
data.Verify(d => d.InsertInvoice(It.Is<Invoice>(i => i.TermPaymentAmount == 0m)), Times.Once());
但是,删除约束并接受任何发票都可以通过测试:
data.Verify(d => d.InsertInvoice(It.IsAny<Invoice>()), Times.Once());
我创建了一个测试Windows窗体,该窗体实例化该测试类,运行其.Setup()
方法,然后调用我要测试的方法。 我在模拟对象未通过测试的代码行上插入断点
data.InsertInvoice(invoice);
实际将鼠标悬停在发票上,我可以确认在调用该方法时其.TermPaymentAmount
十进制属性确实为零。
出于绝望,我什至向我的dataAccess模拟添加了回叫:
data.Setup(d => d.InsertInvoice(It.IsAny<Invoice>())).Callback((Invoice inv) => MessageBox.Show(inv.TermPaymentAmount.ToString("G17")));
这给了我一个显示0
的消息框。 这真的让我感到困惑,而且我的商店中没有其他人能够弄清楚这一点。 任何帮助,将不胜感激。
我可能应该独立询问一个几乎不相关的问题,是更可取的是使用Mock.Verify()
还是使用Mock.Expect()
。 我已经看到其他人在做Mock.VerifyAll()
紧随其后的Mock.VerifyAll()
吗? 如果答案是根据情况而定,那么哪种情况会警告使用一种而不是另一种?
只是为了排除这种情况(因为我有一些像您这样的奇怪行为:
尝试使用Times.Exactly(1)而不是Times.Once()。 使用Times.Once()时,我发生了一些奇怪的事情,不过,我会猜到Once()在内部使用Exactly(1)...
我正在使用Moq的3.1.0.0版本,并且在以下测试案例中未遇到此问题。
internal class Program
{
private static void Main(string[] args)
{
var mock = new Mock<IData>();
mock.Setup(d => d.InsertInvoice(It.IsAny<Invoice>()));
var service = new MyService(mock.Object);
service.DoSomething(new Invoice());
mock.Verify(d => d.InsertInvoice(It.Is<Invoice>(i => i.TermPaymentAmount == 0m)), Times.Once());
Console.ReadLine();
}
}
internal class MyService
{
private readonly IData _data;
public MyService(IData data)
{
_data = data;
}
public void DoSomething(Invoice invoice)
{
_data.InsertInvoice(invoice);
}
}
public class Invoice
{
public decimal TermPaymentAmount { get; set; }
}
public interface IData
{
void InsertInvoice(Invoice invoice);
}
您能否提供更多有关如何使用模拟程序的信息?
我的猜测是,它可能与浮点值的等效检查所固有的问题有关。 您的Invoice.TermPaymentAmount
属性值是计算结果吗?
有关我在说什么的想法,请参见以下可能相关的问题: 检查浮点值是否等于0是否安全?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.