繁体   English   中英

为什么全世界的Moq + NUnit测试都失败了?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM