如何使用延迟执行进行测试?

时间:2012-10-21 23:49:48

标签: c# unit-testing

我的课程中传递了IEnumerable<IDomainInterface>,我想测试是否为每个项目调用了特定的方法:

// in class
var result = _items.SelectMany (x => x.Get (something));

// in test
domainInterfaceMock.Expect(x => x.Get (something));

如果我将ToArray()附加到SelectMany()声明...

,则该测试才会通过

我应该如何处理这种情况?

2 个答案:

答案 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()方法。