1

我的班级有一个IEnumerable<IDomainInterface>传递,我想测试是否为每个项目调用了特定方法:

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

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

只有当我附加ToArray()SelectMany()语句时,测试才会通过......

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

4

2 回答 2

1

这是因为 Get() 仅在评估 LINQ 表达式时调用(即迭代)。如果您在班级中的方法正在调用 Get() 它必须做的不仅仅是

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

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

更新: 您正在测试该方法,因此您应该模拟该方法的输入并将它们传递给实际方法,并测试对这些输入和结果的期望。如果该方法评估 LINQ 表达式本身,那么您会发现它调用 Get(),但是如果它不评估 LINQ 表达式本身,那么您通过强制使用 .ToArray() 进行评估是在做正确的事情。

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

于 2012-10-22T00:04:47.333 回答
0

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

于 2012-10-21T23:58:21.210 回答