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
*/
如果您发布您试图实现的行为交换的具体示例,我们可能会提出一个界面更改来完全避免使用它。
希望这可以帮助。:)