2012-10-21 32 views
1

有传入我的类IEnumerable<IDomainInterface>,我想测试特定的方法是否要求每一个项目:如何测试延期执行?

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

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

测试只有当我追加ToArray()SelectMany()语句将...

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

回答

1

这是因为仅当LINQ表达式被计算(即迭代)时才调用Get()。如果你在你的类方法调用get(),它必须做的东西不仅仅是

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

...因为这本身不会导致任何调用以获得更多的()。您应该修改测试以反映这一点。

更新: 你正在测试的方法,所以你应该嘲笑了输入方法,并通过他们的实际方法,并测试这些输入和结果的期望。如果方法评估LINQ表达式本身,那么你会发现它调用了Get(),但是如果它不评估LINQ表达式本身,你可以通过使用.ToArray()强制执行评估来做正确的事情。

更准确地说,通过调用.ToArray(),您试图演示方法的返回值是您的预期,但要直接执行此操作,您必须分析返回的表达式。如果你想证明的唯一事实是表达式为其所有成员调用Get(),那么你在做什么来实现这一点。

+0

也许我还不够清楚^^我知道原因,但我不知道应该如何修改我的测试。我是否必须一直追踪到下一个语句,其中'result'用作参数? – Matthias

+0

我已添加更新。希望这可以帮助!总之,你并没有真正的单元测试语句,你可以单元测试整个方法。如上所述,您的单元测试是对.SelectMany的单元测试,我将留给微软担心。 –

0

如果x是可嘲弄的(即,它是一个接口或抽象类),那么您可以验证对于每个您创建Get()方法的模拟实例。