4

我的WidgetDoer類取決於Foo,它沒有被注入。我需要假冒_foo的執行DoStuffWith()(然後驗證Do()返回結果 - 這是我的真實代碼的簡化表示)。Typemock Isolator:模擬未注入的依賴關係?

public class WidgetDoer { 
    readonly Foo _foo; 

    public WidgetDoer() { 
     _foo = new Foo(); 
    } 

    public Bar Do(Widget widget) { 
     var result = _foo.DoStuffWith(widget); 
     return result; 
    } 
} 

我試着用下面的隔離語法來防止創建(在WidgetDoer()構造函數中)真正的Foo對象,但真正Foo對象反正實例:

var fooFake = Isolate.Fake.Instance<Foo>(); 
Isolate.WhenCalled(() => new Foo()).WillReturn(fooFake); 

我可以使用Typemock模擬未注入的依賴關係?

回答

0

首先,與TypeMock Isolatar API時,我強烈建議你有這個PDF在你身邊:TypeMock Isolator API Quick Reference(PDF)

對於以上這一點,是的,我覺得這是一個常見的錯誤,創建一個假的不意味着它被使用。就像你上面指出的那樣,爲了使用它,你必須做類似的事情:

Isolate.Swap.NextInstance<Foo>().With(FooFake); 

這將交換下一個實例。我敢肯定,你也可以這樣做:

Isolate.Swap.NextInstance<Foo>().With(FooFake); 
Isolate.Swap.NextInstance<Foo>().With(FooFake2); 

這將交換的下一個對象的創建與FooFake實例,然後一前一後,與FooFake2

你也可以這樣做:

Isolate.Swap.AllInstances<Foo>().With(FooFake); 

這將交換所有將來的對象創建與假。如果您正在查看可能不明顯的對象創建將發生多少次的代碼,這非常有用。

2

免責聲明我在Typemock工作。

交換實例現在已經過時了一段時間。 您可以使用:

var fakeFoo = Isolate.Fake.NextInstance<Foo>(); 

fakeFoo是代理在代碼_Foo。

您還可以使用:

var fakeFoo = Isolate.Fake.AllInstances<Foo>(); 

這裏fakeFoo是一個代理,從該行創建(新)的Foo類的實例。

這兩個示例都在一個命令中創建了一個和「swap」。