我使用fakeiteasy来伪造一些实体框架调用,以确保一堆奇怪的遗留数据库表被正确映射。
我需要声明一个发票与特定送货地址匹配的客户正在被添加到数据库中。
如果我这样做:
A.CallTo(() => db.Customers.Add(
A<Customer>.That.Matches(
c => c.Invoices.First().Address == EXPECTED_ADDRESS)
)
)).MustHaveHappened();
代码工作得很好。我想通过将期望移到别处来简化语法,但是当我这样做时:
var expected = A<Customer>.That.Matches(
c => c.Invoices.First().Address == EXPECTED_ADDRESS)
);
A.CallTo(() => db.Customers.Add(expected)).MustHaveHappened();
测试失败。fakeiteasy代码中发生了什么,这意味着期望表达式在内联时工作,但不能在变量中捕获并在以后重用?
最佳答案
答案在Always place Ignored and That inside A.CallTo的文档中:Ignored
(和_
)和That
匹配符必须放在A.CallTo
调用内的表达式中。这是因为这些特殊的约束方法不返回实际的匹配器对象。它们告诉fakeiteasy如何通过触发的特殊事件来匹配参数,然后调用约束方法。Fakeiteasy只在A.CallTo
的上下文中侦听事件。
不过,我很惊讶“测试失败”。你用的是什么版本?从fie 2.0.0开始,使用That
就像使用should throw an exception一样
System.InvalidOperationException : A<T>.Ignored, A<T>._, and A<T>.That
can only be used in the context of a call specification with A.CallTo()