繁体   English   中英

如何测试延迟执行?

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

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