如何在NSubstitute中撤消`Arg.Do <t>(()=&gt; {})`

时间:2016-06-15 18:55:22

标签: nsubstitute

我有这段代码:

sub.Foo(Arg.Do<int>(() => {}));

如何撤消此操作?

.ClearReceivedCalls().ClearReturnValues()似乎对删除此委托没有任何影响

1 个答案:

答案 0 :(得分:1)

目前还没有一种方法可以删除操作,但您可以通过不同的方式对其进行排队,以便停止运行。

第一个选项是使用外部操作,然后在以后更改它。

// Clear action manually
Action<string> action = x => SideEffect();
sub.Foo(Arg.Do<string>(x => action(x)));
// ...
action = x => { };

该方法的一种变体可以让你修改动作以自动清除它自己(或者我们可以使用一个保护子句来确保它只运行所需的次数):

// Self-clearing action (run once):
Action<string> action = x =>
{
    SideEffect();
    action = _ => { };
};
sub.Foo(Arg.Do<string>(x => action(x)));

另一种选择是使用Callback builder。这适用于When..Do而非Arg.Do,但确实可以让您对不同的操作序列排队方式有所控制(有关更为复杂的示例,请参阅documentation):

// Callback builder:
// (See )
sub.When(x => x.Foo(Arg.Any<string>()))
   .Do(Callback.First(call => SideEffect()));