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

C# 如何使用延迟执行进行测试?,c#,unit-testing,C#,Unit Testing,有一个IEnumerable传递到我的类中,我想测试是否为每个项调用了特定的方法: // in class var result = _items.SelectMany (x => x.Get (something)); // in test domainInterfaceMock.Expect(x => x.Get (something)); 只有在我将ToArray()附加到SelectMany()语句后,测试才会通过 我应该如何处理这种情况?如果x是可模拟的(即它是一个接口

有一个
IEnumerable
传递到我的类中,我想测试是否为每个项调用了特定的方法:

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

// in test
domainInterfaceMock.Expect(x => x.Get (something));
只有在我将
ToArray()
附加到
SelectMany()
语句后,测试才会通过

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

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

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

这是因为Get()仅在计算LINQ表达式(即迭代)时才被调用。如果类中的方法正在调用Get(),那么它肯定在做一些事情,而不仅仅是

var result = _items.SelectMany (x => x.Get (something));
。。。因为这本身不会导致对Get()的任何调用。您应该修改测试以反映这一点

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

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

这是因为Get()仅在计算LINQ表达式(即迭代)时才被调用。如果类中的方法正在调用Get(),那么它肯定在做一些事情,而不仅仅是

var result = _items.SelectMany (x => x.Get (something));
。。。因为这本身不会导致对Get()的任何调用。您应该修改测试以反映这一点

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


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

也许我不够清楚^^^我知道原因,但我不知道应该如何修改我的测试。我是否必须一直跟踪到下一个语句,其中
result
用作参数?我添加了一个更新。希望这有帮助!总之,您并不是真正的单元测试语句,而是对整个方法进行单元测试。如上所述,您的独立单元测试是一种.SelectMany的单元测试,我将把它留给Microsoft来担心。也许我不够清楚^^^我知道原因,但我不知道应该如何修改我的测试。我是否必须一直跟踪到下一个语句,其中
result
用作参数?我添加了一个更新。希望这有帮助!总之,您并不是真正的单元测试语句,而是对整个方法进行单元测试。如上所述,您的独立单元测试是一种.SelectMany的单元测试,这一点我将留给Microsoft来考虑。