C# NSubstitute clearing When().Do()

C# NSubstitute clearing When().Do(),c#,.net,unit-testing,nsubstitute,C#,.net,Unit Testing,Nsubstitute,使用NSubstitute是否可以清除或删除以前的.When().Do()配置 substitute.When(s => s.Method(1)).Do(c => { /* do something */ }); // code substitute.When(s => s.Method(1)).Clear(); // <-- is this possible? substitute.When(s => s.Method(1)).Do(c => { /* d

使用NSubstitute是否可以清除或删除以前的.When().Do()配置

substitute.When(s => s.Method(1)).Do(c => { /* do something */ });
// code

substitute.When(s => s.Method(1)).Clear(); // <-- is this possible?
substitute.When(s => s.Method(1)).Do(c => { /* do something different */ });
// other code
substitute.When(s=>s.Method(1)).Do(c=>{/*Do something*/});
//代码
替换.When(s=>s.Method(1)).Clear();//s、 方法(1)).Do(c=>{/*做一些不同的事情*/});
//其他代码
查看
回调操作
,似乎没有删除或替换回调的方法

使用一个示例证明缺少替换功能

int state = 0;
var substitute = Substitute.For<IFoo>();

substitute.When(s => s.Bar()).Do(c => state++);
substitute.Bar();
Assert.That(state, Is.EqualTo(1));

substitute.When(s => s.Bar()).Do(c => state--);
substitute.Bar();

// FAIL: Both Do delegates are executed and state == 1
Assert.That(state, Is.EqualTo(0));
缺少对NSubstitute API的更改,解决方法是:

var state = 0;
var substitute = Substitute.For<IFoo>();

Action<CallInfo>[] onBar = {c => state++};

substitute.When(s => s.Bar()).Do(c => onBar[0](c));
substitute.Bar();
Assert.That(state, Is.EqualTo(1));

onBar[0] = c => state--;
substitute.Bar();
Assert.That(state, Is.EqualTo(0));
var状态=0;
var substitute=substitute.For();
Action[]onBar={c=>state++};
替换.When(s=>s.Bar()).Do(c=>onBar[0](c));
替换.Bar();
断言。该(状态,为.EqualTo(1));
onBar[0]=c=>state--;
替换.Bar();
断言(state,Is.EqualTo(0));

为什么onBar需要是一个包含单个元素的数组?这和闭包有关吗?是的。这是修改闭包的一种方法。您上面提到的dupe问题是通过class+属性实现的。这稍微减少了代码的可读性,但是我也可以对类本身使用一个属性,然后用
This.onBar
引用它,对吗?我就是不能使用局部变量。是的,
this.onBar
也可以。基本上,为了避免闭包限制,您需要提供一个指向指针的指针。第一次,我投票结束了我自己的问题:D
var state = 0;
var substitute = Substitute.For<IFoo>();

Action<CallInfo>[] onBar = {c => state++};

substitute.When(s => s.Bar()).Do(c => onBar[0](c));
substitute.Bar();
Assert.That(state, Is.EqualTo(1));

onBar[0] = c => state--;
substitute.Bar();
Assert.That(state, Is.EqualTo(0));