Warum erhalte ich eine Exception mit der Meldung "Ungültige Konfiguration auf einem nicht virtuellen (überschreibbaren in VB) Mitglied ..."?
Habe ich einen unit test, wo ich simulieren Sie eine nicht-virtuelle Methode, liefert einen bool-Typ
public class XmlCupboardAccess
{
public bool IsDataEntityInXmlCupboard(string dataId,
out string nameInCupboard,
out string refTypeInCupboard,
string nameTemplate = null)
{
return IsDataEntityInXmlCupboard(_theDb, dataId, out nameInCupboard, out refTypeInCupboard, nameTemplate);
}
}
Also ich habe ein mock-Objekt der XmlCupboardAccess
Klasse und ich bin versucht, setup-mock für diese Methode in meinem test-Fall, wie unten gezeigt
[TestMethod]
Public void Test()
{
private string temp1;
private string temp2;
private Mock<XmlCupboardAccess> _xmlCupboardAccess = new Mock<XmlCupboardAccess>();
_xmlCupboardAccess.Setup(x => x.IsDataEntityInXmlCupboard(It.IsAny<string>(), out temp1, out temp2, It.IsAny<string>())).Returns(false);
//exception is thrown by this line of code
}
Aber diese Zeile wirft Ausnahme
Invalid setup on a non-virtual (overridable in VB) member:
x => x.IsDataEntityInXmlCupboard(It.IsAny<String>(), .temp1, .temp2,
It.IsAny<String>())
Jede Anregung, wie man um diese Ausnahme?
Kommentar zu dem Problem
Was in deinem test hängt von
XmlCupboardAccess
? Ihr einfach.. Sie brauchen, um Sie zu markieren,
virtual
. Moq kann nicht verspotten einen konkreten Typ, kann es nicht außer Kraft gesetzt. InformationsquelleAutor der Frage Rahul Lodha | 2014-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Moq kann mock nicht-virtuelle Methoden, versiegelte Klassen und. Beim ausführen eines Tests mit mock-Objekt, MOQ eigentlich erstellt eine in-memory-proxy-Typ erbt von Ihrem "XmlCupboardAccess" und überschreibt die Verhaltensweisen, die Sie eingerichtet haben, in der "SetUp-Methode". Und wie Sie wissen in C# können Sie das überschreiben nur etwas, wenn es markiert ist, als virtuelle, das ist nicht der Fall mit Java. Java davon ausgeht, dass jede nicht-statische Methode werden virtuelle standardmäßig.
Andere Sache, die ich glaube, Sie sollten prüfen, ist die Einführung einer Schnittstelle für Ihre "CupboardAccess" und starten Sie verspotten die Schnittstelle statt. Würde es helfen, entkoppeln Sie Ihren code und haben Vorteile in der langen run.
Schließlich gibt es frameworks wie : TypeMock und JustMock, die direkt mit der IL und damit kann mock nicht-virtuelle Methoden. Beide jedoch sind kommerzielle Produkte.
InformationsquelleAutor der Antwort Amol
Finden
Warum hat die Eigenschaft, die ich will, zu verhöhnen, müssen virtuell sein?
Können Sie schreiben eine wrapper-Schnittstelle oder markieren Sie die Eigenschaft als virtuelle/abstrakte als Moq erstellen Sie eine proxy-Klasse, die verwendet wird, um Anrufe abfangen und wieder deine benutzerdefinierte Werte, die Sie in der
.Returns(x)
nennen.InformationsquelleAutor der Antwort Bryida
Code:
siehe aber Ausnahme.
InformationsquelleAutor der Antwort Borat