我的课程中传递了IEnumerable<IDomainInterface>
,我想测试是否为每个项目调用了特定的方法:
// in class
var result = _items.SelectMany (x => x.Get (something));
// in test
domainInterfaceMock.Expect(x => x.Get (something));
如果我将ToArray()
附加到SelectMany()
声明...
我应该如何处理这种情况?
答案 0 :(得分:1)
这是因为只在评估LINQ表达式(即迭代)时调用Get()。如果你的类中的方法正在调用Get(),那么它必须做的不仅仅是
var result = _items.SelectMany (x => x.Get (something));
...因为这本身不会导致对Get()的任何调用。您应该修改测试以反映这一点。
<强>更新强> 您正在测试该方法,因此您应该模拟方法的输入并将它们传递给实际方法,并测试对这些输入和结果的期望。如果该方法评估LINQ表达式本身,那么你会发现它调用了Get(),但是如果它没有评估LINQ表达式本身,你就是通过强制使用.ToArray()进行评估来做正确的事情。
更准确地说,通过调用.ToArray(),您试图证明该方法的返回值是您所期望的,但要直接执行此操作,您必须分析返回的表达式。如果您要证明的唯一事实是表达式为其所有成员调用Get(),那么您所做的就是实现。
答案 1 :(得分:0)
如果x是可模拟的(即,它是一个接口或抽象类),那么您可以验证为您创建的每个模拟的x实例调用Get()方法。