Moq eine Basisklasse Funktion in einer abgeleiteten Klasse
Ich bin neu auf Moq und ich schaute zu, wie pluralsight video auf Moqing so fühlte ich mich ermächtigt, zu gehen und schreiben Sie ein paar tests. Ich habe eine Base-Klasse sagen wir mal-Blatt, das eine Schnittstelle implementiert ISheet. Blatt ist die Basisklasse für pages:
abstract class Sheet: ISheet
{
public virtual void CreateSheet() //Defined in ISheet
{
}
public virtual void BuildSheet() //Defined in ISheet
{
}
//and some abstract methods, etc.
}
public class Page : Sheet
{
public override void CreateSheet()
{
BuildSheet(); //Base class implementation
}
}
Ich überschrieb eine der Methoden von der Basisklasse, die CreateSheet()
, aber ich möchte, um zu testen, ob die BuildSheet()
Methode in der Basisklasse wird aufgerufen, aus meiner abgeleiteten Klasse:
So, in meiner Test-Klasse, ich Moq SUT anstelle der Schnittstelle
var MockSheet = new Moq<Page>();
rufen Sie die Methode:
var actual = MockSheet.Object.CreateSheet();
Dann überprüfen
MockSheet.Verify(x => x.BuildSheet(), Times.AtLeastOnce);
Stattdessen bekomme ich MockException “Erwartet den Aufruf auf den mock-mindestens einmal, wurde aber nie durchgeführt. Die CreateSheet-Methode nie aufgerufen wird. Wenn ich Wechsel, den er CreateSheet Methode:
public void CreateDocSheet() //removed override
{
BuildSheet() //base classses implementation
}
Und in der test-Aufruf:
var actual = MockSheet.Object.CreateDocSheet();
Es funktioniert. Ich verstehe nicht, warum. Ich glaube, das funktional, das ist eine gültige Möglichkeit, die Codierung, ich habe Blatt hat 2 Seiten, ich habe eine Schnittstelle, die definiert alle Funktionen und Eigenschaften, die umgesetzt werden sollten, ich diese Funktionen implementieren, die in der Basisklasse, aber nicht alle Methoden implementiert, die in den abgeleiteten Klassen so, irgendeine Methode, die überschrieben werden und einige nutzen die Implementierung der Basisklasse. Bitte erklären Sie, warum es ein Problem mit der überschriebenen version der Funktion?
InformationsquelleAutor user3666407 | 2015-01-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie ändern
in
Ihre mock (die man sich vorstellen kann als eine abgeleitete Klasse von
Page
) nennen die Umsetzung vonPage
im mock eigenen überschreiben vonCreateSheet
.Den default-Verhalten (wenn Sie sich nicht ändern
CallBase
) ist für Moq überschreiben jede Methode und Eigenschaft, die es können, und verwenden Sie eine leer Umsetzung. EinstellungCallBase
zutrue
macht Moq rufen Sie diePage
Umsetzung statt, wie ich sagte.(Natürlich
MockSheet.Setup(x => x.CreateDocSheet()).Callback(() => { /* something */})
wenn Sie wollenCreateDocSheet
etwas zu tun, was nicht-trivial.)In dem Fall, wo Sie entfernt die
virtual
Modifikator vonCreateSheet
, Moq, können nicht mehr außer Kraft setzen oder mock dieses Mitglied. Denken Sie daran: Wie konnte Moq "mock" eine nicht-virtuelle Methode? Daher der Aufruf umgeht Moq - Klasse komplett.Page.CreateSheet
AnrufeSheet
'sBuildSheet
Umsetzung und nichtPage
'sBuildSheet
Umsetzung. Moq ist nur in der Lage, Telefongespräche aufzuzeichnen, um es in den eigenen proxy für die verspottet Objekt selbst.Vielen Dank, dass gearbeitet und vielen Dank für die Erklärung. Ich dachte, dass es eine Möglichkeit zum testen einer Basisklasse Implementierung einer abgeleiteten Klasse, ohne zu schreiben, eine neue Funktion, die ich nicht planen sowieso.
InformationsquelleAutor Jeppe Stig Nielsen
Moq ist für die Nachahmung einer Abhängigkeit oder Abhängigkeiten von Ihrem system under test, so dass Sie isolieren können, die vom rest der Anwendung oder Externalitäten, nicht für ersetzen Ihr system unter test. Es ist nicht das richtige Werkzeug für das, was Sie hier zu tun versuchen.
InformationsquelleAutor tom.dietrich