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
*/
,我們可能會想出一個界面更改以避免完全使用它。
希望這會有所幫助。 :)
非常感謝您的回覆。我想到了將自己與自己聯繫起來並修復它。但我很高興看到我的決定得到驗證。並感謝分享的方式來做到這一點。雖然你已經建議我會盡量避免這種情況。 – Anupam