【发布时间】:2010-04-15 16:51:08
【问题描述】:
我有这个 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());
我创建了一个测试窗口窗体,它实例化这个测试类,运行它的.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(),正如我看到其他人所做的那样?如果答案是情境性的,哪些情况会值得使用其中一种?
【问题讨论】:
-
你用的是什么版本的起订量?
-
马克 - 你发现我在运行 4.0 测试版时没有意识到,尽管我已经切换到 3.1.0.0 并且仍然遇到同样的问题。
-
我可以补充一点,我绝望地尝试了这个: data.Setup(d => d.InsertInvoice(It.Is
(i => i.TermPaymentAmount != 0))) .Throws(new ArgumentException("TermPaymentAmount 不是 0!"));并且它的行为符合预期,并且不会抛出此异常,因为 Invoice.TermPaymentAmount 为 == 0。(当我将比较更改为 != 0 时它会抛出异常。)所以这确实完成了相同的检查我最初是在努力,虽然我不知道为什么我的初始方法不起作用。 -
您对此有什么了解吗?
-
这个特殊问题对我来说仍然是个谜,尽管我最近发现,当我验证一个模拟上的方法被调用“Times.Once()”时,Moq 给我的异常消息不清楚该方法是被调用了零次还是多次调用,所以我一直打算在有时间的时候重新解决这个问题。