作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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,因为它的使用可能是封装失败的征兆。将行为强制到替代对象中可以表明我们正在测试的类与依赖类的行为有深度耦合,而不是我们要替代的接口(interface)。
有了这个免责声明,您可以换掉回调的一种方法是使用帮助类来提供特定的回调:
[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
*/
如果您发布了您试图实现的行为交换的具体示例,我们可能会想出一个界面更改来完全避免使用它。
希望这对您有所帮助。 :)
关于c# - NSubstitute When...Do 定义不会被后续定义覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14273446/
我是一名优秀的程序员,十分优秀!