[英]NSubstitute When…Do definition is not getting overriden by subsequent definitions
void ABC()
{
var foo = Substitute.For<IFoo>();
foo.When(x => x.Bar()).Do(x => counter++);
<use Bar()>.... 1
foo.When(x => x.Bar()).Do(x => counter--);
<use Bar()>.... 2
}
对于上面的代码片段,(1)和(2)都显示counter ++行为,指示“ When ... Do”行为没有被覆盖。 在生成要连接不同回调的测试场景时,我需要这种行为。
我应该如何实现呢?
Do
回调不会被替换,但是两者都应执行。 例如(使用NSub 1.4.3.0):
var counter = 0;
var sub = Substitute.For<IFoo>();
sub.When(x => x.Bar()).Do(x => counter++);
sub.Bar();
Console.WriteLine(counter); // prints 1
sub.When(x => x.Bar()).Do(x => counter--);
sub.Bar();
Console.WriteLine(counter); // prints 1, as counter gets inc'd to 2, then dec'd to 1
我建议谨慎使用When..Do,因为它的使用可能是封装失败的症状。 将行为强制为替换对象可以表明我们正在测试的类与依赖类的行为(而不是我们要替代的接口)之间存在深层耦合。
使用该免责声明,可以换出回调的一种方法是使用助手类来提供特定的回调:
[Test]
public void Example() {
var counter = 0;
var helper = new CallbackHelper();
helper.Callback = x => counter++;
var sub = Substitute.For<IFoo>();
sub.When(x => x.Bar()).Do(x => helper.Callback(x));
sub.Bar();
Console.WriteLine(counter);
helper.Callback = x => counter--;
sub.Bar();
Console.WriteLine(counter);
helper.Callback = x => { counter = (counter+1) * 10; };
sub.Bar();
Console.WriteLine(counter);
}
public class CallbackHelper {
public Action<CallInfo> Callback;
}
/* Prints:
1
0
10
*/
如果您发布了您要实现的行为交换的特定示例,我们也许可以提出接口更改,以免完全使用此功能。
希望这可以帮助。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.