2009-12-29 6 views

Antwort

16

eine Art lustig zu machen, muss es entweder eine Schnittstelle sein oder virtuelle Elemente (abstrakte Elemente auch virtuell) (dies wird auch seine rein virtuelle genannt).

Durch diese Definition können Sie alles, was ist virtuell mockten.

Im Wesentlichen, dynamische Mocks tun Sie nichts, was Sie nicht mit der Hand tun könnten.

Angenommen, Sie programmieren gegen eine Schnittstelle wie diese:

public interface IMyInterface 
{ 
    string Foo(string s); 
} 

Sie manuell eine Testspezifische Implementierung von IMyInterface schaffen könnte, die den Eingangsparameter ignoriert und immer wieder die gleiche Ausgabe:

public class MyClass : IMyInterface 
{ 
    public string Foo(string s) 
    { 
     return "Bar"; 
    } 
} 

Aber das wird sich wirklich schnell wiederholen, wenn Sie testen möchten, wie der Verbraucher auf unterschiedliche Rückgabewerte reagiert, also statt Testdoppel per Hand zu codieren, können Sie ha ve ein Framework dynamisch für Sie erstellen.

Stellen Sie sich vor, dass dynamische Mocks wirklich Code ähnlich der MyClass-Implementierung oben schreiben (sie schreiben den Code nicht wirklich, sie geben die Typen dynamisch aus, aber es ist eine genau genug Analogie).

Hier ist, wie Sie das gleiche Verhalten wie MyClass mit Moq definieren könnte:

var mock = new Mock<IMyInterface>(); 
mock.Setup(x => x.Foo(It.IsAny<string>())).Returns("Bar"); 

In beiden Fällen ist die construcor der erzeugten Klasse aufgerufen wird, wenn das Objekt erstellt wird. Da eine Schnittstelle keinen Konstruktor hat, ist dies normalerweise der Standardkonstruktor (von MyClass bzw. der dynamisch emittierten Klasse).

Sie das gleiche mit konkreten Typen wie diesem tun:

public class MyBase 
{ 
    public virtual string Ploeh() 
    { 
     return "Fnaah"; 
    } 
} 

Mit der Hand, würde Sie in der Lage sein, von MyBase abzuleiten und die Ploeh Methode überschreiben, weil es virtuell ist:

public class TestSpecificChild : MyBase 
{ 
    public override string Ploeh() 
    { 
     return "Ndøh"; 
    } 
} 

Eine dynamische Scheinbibliothek kann dasselbe tun, und dasselbe gilt für abstrakte Methoden.

Sie können jedoch keinen Code schreiben, der ein nicht virtuelles oder internes Mitglied außer Kraft setzt, und dynamische Mocks auch nicht. Sie können nur tun, was Sie von Hand tun können.

Vorbehalt: Die obige Beschreibung gilt für die meisten dynamischen Mocks mit Ausnahme von TypeMock, die anders ist und unheimlich ist.

+0

Es gibt auch eine neuere Spottbibliothek, Microsoft Moles, die tut, was TypeMock auch tut ... es verhöhnt alles, einschließlich nicht-virtueller, versiegelter und statischer Methoden. –

3

Von Stephen Walther's blog:

Sie können Moq verwenden Mocks von beiden Schnittstellen zu erstellen und vorhandene Klassen. Es gibt einige Anforderungen an die Klassen. Die Klasse kann nicht versiegelt werden. Darüber hinaus muss die zu spottende Methode als virtuell markiert werden. Sie können statische Methoden nicht vortäuschen (verwenden Sie das Adaptermuster, um eine statische Methode nachzuahmen).

+0

Ja, aber ist eine abstrakte Klasse nicht sehr wie eine Schnittstelle? hmmm – mrblah

+0

Der Schlüssel sind virtuelle Funktionen, mit denen der Mock dynamisch einen Proxy generieren kann, der aufgerufen werden kann. – duffymo

Verwandte Themen