2013-01-11 27 views
2
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行爲沒有得到覆蓋。我需要這種行爲來生成我想要連接不同回調的測試場景。NSubstitute當......定義沒有被後續定義覆蓋

我該怎麼做到這一點?

回答

5

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 
*/ 

,我們可能會想出一個界面更改以避免完全使用它。

希望這會有所幫助。 :)

+0

非常感謝您的回覆。我想到了將自己與自己聯繫起來並修復它。但我很高興看到我的決定得到驗證。並感謝分享的方式來做到這一點。雖然你已經建議我會盡量避免這種情況。 – Anupam