4

Meine WidgetDoer Klasse ist abhängig von Foo, die nicht injiziert wird. Ich muss die _foo Implementierung von DoStuffWith() vortäuschen (und dann überprüfen, dass Do() das Ergebnis zurückgab - das ist eine vereinfachte Darstellung meines echten Codes).Typemock Isolator: Mock eine Abhängigkeit, die nicht injiziert wird?

public class WidgetDoer { 
    readonly Foo _foo; 

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

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

Ich habe versucht, die folgende Trenner Syntax zu verwenden, um eine echte Foo Objekt zu verhindern (im WidgetDoer() Konstruktor) erstellt werden, aber die eigentliche Foo Objekt instanziiert trotzdem:

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

Kann ich Typemock, um eine Abhängigkeit zu verspotten, die nicht injiziert wird?

Antwort

0

Zuerst wird, wenn mit der TypeMock Isolatar API arbeiten, empfehle ich Ihnen haben diese PDF an Ihrer Seite: TypeMock Isolator API Quick Reference(PDF)

In Bezug auf den Punkt oben, ja ich es ein weit verbreiteter Fehler feststellen, dass eine gefälschte Erstellung nicht der Fall ist bedeutet, dass es benutzt wird. Wie Sie oben erwähnt haben, müssen Sie etwas tun wie:

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

Dies wird die nächste Instanz tauschen. Ich bin mir ziemlich sicher, dass Sie auch tun:

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

Dies wird die nächste Objekterstellung mit der FooFake Instanz tauschen, und dann derjenige danach mit FooFake2

Sie können auch dies tun:

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

Dies wird alle zukünftigen Objekterstellung mit der Fälschung tauschen. Dies ist sehr nützlich, wenn Sie Code betrachten, bei dem es nicht offensichtlich ist, wie oft Objekte erstellt werden.

2

Haftungsausschluss Ich arbeite bei Typemock.

Das Auslagern von Instanzen ist seit einiger Zeit veraltet. Sie können:

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

fakeFoo ein Proxy ist im Code _foo.

Sie können auch verwenden:

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

Hier fakeFoo ist ein Proxy für alle Instanzen von Foo, die (neu) erstellt von dieser Linie auf.

Beide Beispiele erstellen eine gefälschte und "swap" es in einem Befehl.