Wie zum erstellen von Mock für die abstrakte Basis-Klasse mit MOQ-framework?
Möchte ich schreiben unit-tests für MyClass aber seine Basis-Klasse ist eine abstrakte Klasse.
public class MyClass : AbstractBaseClass
{
}
Möchte ich verspotte die AbstractBase Klasse, so dass ich überspringen können einige der Logik in seinem Konstruktor beim erstellen der MyClass-Instanz, die ich testen möchte. Gibt es trotzdem kann ich dies tun?
//Unit Test
var test = new Mock<IInterface>();
var derivedclass = new DerivedClass(test.Object);
test.Setup(d=>d.MyMethod(It.IsAny<string>()).returns(2);
derivedclass.MyMethod("hello");
//Derived Class
class DerivedClass : AbstractClass{
//constuctor
public DerivedClass(IInterface interface){
_interface = interface;
}
public MyMethod(string str){
return 2;
}
}
//Abstract Class
public abstract class AbstractClass
{
//This method gets called when i create the instance of the derived class in my unit
test..
protected AbstractedClass() : this(new SomeOtherClass()){
DoSomethingElse(); ///I want to skip this method or mock it.
}
}
Sie haben ein design-Problem. AbstractClass ist hardcoding Instanziierung einer Abhängigkeit in seiner en. Wenn Methoden für diese Abhängigkeit sind, was Sie wollen, zu verspotten, müssen Sie ändern die AbstractClass Tor zu nehmen, in die Abhängigkeit. Wenn Sie können etwas erläutern, was diese Methode wird intern, vielleicht werden Sie einige bessere Antworten
InformationsquelleAutor Dexterslab | 2011-05-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Durch Erben von der Basisklasse erweitern Sie es. Es ist mehr darum, Ihren code in eine testbare Zustand eher, als das Moq für Sie arbeiten.
Haben oder dass die Logik, die Sie nicht wollen, werden Teil einer virtuellen Methode, die Sie verspotten. (wie @Ohad Horesh Antwort:)
Wenn diese Optionen nicht lebensfähig sind, dann werden Sie entweder zu haben, um zu testen, ob die Funktionalität durch die abgeleitete Klasse, oder verwenden Sie eine andere mocking-framework wie TypeMock Isolator, Maulwürfe oder JustMock.
InformationsquelleAutor aqwert
Ja, das ist eine ziemlich grundlegende Szenario, in Moq.
Vorausgesetzt, Ihre abstrakte Klasse sieht wie folgt aus:
Können Sie den test unter:
Bitte beachten Sie, dass Foo() müssen gekennzeichnet werden als virtual in der definition in AbstractBaseClass
In diesem Fall, Sie wirklich don ' T test etwas. Sie vergleichen Sie einfach verspottet Wert mit const-Wert. Es macht keinen Sinn, das zu tun.
InformationsquelleAutor Ohad Horesh