2016-07-19 8 views
2

A ist eine Klasse aus einer referenzierten DLL und kann daher nicht geändert werden. Es hat eine Methode Foo(), die innerhalb meiner DoFoo() Methode aufgerufen wird (unter A als Parameter). Ich möchte DoFoo() testen, ohne Foo() auszuführen, weil es teuer ist und bereits getestet wurde.Ersetzen Sie die Implementierung einer "versiegelten" Klasse

Was ist die beste Vorgehensweise in einer solchen Situation?

Meine Gedanken dazu:

  • eine Wrapper-Klasse erstellen um A und in DoFoo() passieren. Die Wrapper-Klasse unterscheidet zwischen der echten und der falschen Implementierung.
  • Das gleiche könnte mit Erweiterungsmethoden durchgeführt werden.
  • Verwenden Sie dynamic und übergeben Sie eine falsche Klasse mit einer leeren DoFoo() Implementierung.

Antwort

4

Erstellen Sie eine Schnittstelle, die die Methoden enthält, die Sie bereitstellen möchten.

Erstellen Sie eine Wrapper-Klasse, die diese Schnittstelle implementiert und die Klassen der externen Assembly verwendet, um ihre Arbeit zu erledigen. Sie können andere Implementierungen dieser Schnittstelle wie eine Scheinimplementierung erstellen.

Injizieren Sie die Schnittstelle mit Konstruktorinjektion zum Beispiel in die Klassen, in denen Sie die Funktionalität benötigen.

In Ihrem Test können Sie dann die Implementierung, die die externe Bibliothek verwendet, einfach durch Ihre Scheinimplementierung ersetzen.

+0

Was für die Schnittstelle ist? Nur eine Wrapper-Klasse, die entweder den echten Weg gehen oder einfach nichts tun würde, würde reichen, oder? Gibt es einen Vorteil, den ich verpasst habe? –

+0

Schnittstellenbasierte Programmierung, um Abhängigkeiten reduzieren zu können. Die reale Implementierung wird durch Konstruktorinjektion injiziert. Also ja, ich empfehle Schnittstellen zu verwenden. –

1

Eigentlich ist es sehr einfach, es mit Typemock zu tun, Sie müssen Wrapper nicht verwenden oder Schnittstellen erstellen, Sie können es nur verspotten. Zum Beispiel:

Methode im Test:

public string DoFoo(A a) 
    { 
     string result = a.Foo(); 
     return result; 
    } 
} 

sealed public class A 
{ 
    public string Foo() 
    { 
     throw new NotImplementedException(); 
    } 
} 

Test:

[TestMethod,Isolated] 
public void TestMethod1() 
{ 
    var a = Isolate.Fake.Instance<A>(Members.CallOriginal); 

    Isolate.WhenCalled(() => a.Foo()).WillReturn("TestWorked"); 

    var classUnderTest = new Class1(); 
    var result = classUnderTest.DoFoo(a); 

    Assert.AreEqual("TestWorked", result); 
} 
+0

Link ist kaputt, es zeigt auf http://www.typemCOk.com/ anstelle von http://www.typemock.com/ – Roman

+1

danke Roman ich habe es behoben. – JamesR

+0

Sieht gut aus, würde mich interessieren, wie sie das machen. Aber ich denke nicht, dass ich mit einer kommerziellen Lösung gehen werde. –

Verwandte Themen