[英]How to test with deferred execution?
我的类中传递了一个IEnumerable<IDomainInterface>
,我想测试是否为每个项目都调用了特定的方法:
// in class
var result = _items.SelectMany (x => x.Get (something));
// in test
domainInterfaceMock.Expect(x => x.Get (something));
仅当我将ToArray()
附加到SelectMany()
语句时,测试才能通过...
我应该如何处理这种情况?
这是因为仅在评估LINQ表达式(即迭代)时才调用Get()。 如果您的类中的方法正在调用Get(),则它所要做的不仅仅是
var result = _items.SelectMany (x => x.Get (something));
...因为这本身不会导致对Get()的任何调用。 您应该修改测试以反映这一点。
更新:您正在测试该方法,因此您应该模拟该方法的输入并将它们传递给实际方法,并测试对这些输入和结果的期望。 如果该方法对LINQ表达式本身求值,那么您会发现它调用Get(),但是,如果该方法不对LINQ表达式本身求值,则通过强制使用.ToArray()来执行正确的操作。
通过调用.ToArray()更准确地说,您试图证明该方法的返回值是您所期望的,但是要直接执行此操作,您必须分析返回的表达式。 如果您要证明的唯一事实是该表达式为其所有成员调用Get(),那么您正在执行的操作就可以实现。
如果x是可模拟的(即它是接口或抽象类),则可以验证为每个创建的x的模拟实例都调用了Get()方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.