Simulieren Sie eine Methode zum test
Versuchen zu verspotten, eine Methode, die aufgerufen wird, eine andere Methode.
public virtual bool hello(string name, int age)
{
string lastName = GetLastName();
}
public virtual string GetLastName()
{
return "xxx";
}
Mock<program> name= new Mock<program>();
name.Setup(x => x.GetLastName()).Returns("qqq");
Ich soll die Methode GetName, um immer wieder "qqq".
welches problem haben Sie mit dem, was Sie versucht haben? das sieht richtig
Der Wert von meinem letzten Namen ist noch = xxx wenn ich die Haltepunkte in. Auch fehlt dem Gerät testen
Der Wert von meinem letzten Namen ist noch = xxx wenn ich die Haltepunkte in. Auch fehlt dem Gerät testen
InformationsquelleAutor codeislife | 2016-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte dies funktionieren, vorausgesetzt, diese sind die vollständige Methode Implementierungen
Bin ich noch nicht ganz, nach deinem Kommentar:
Mock<T>
können Sie zu verspotten, eine Art vonT
-T
wird eine generische Anzeige, die auch Sinn so ziemlich alles, was ein Klasse. In der traditionellen, Sie wäre Spott eininterface
, nicht eine tatsächlicheclass
, aber in dem Beispiel oben, wir sind die Verspottung der a-Klasse. Für den Beispiel-unit-test geschrieben, der Zweck der unit test testen Sie die Implementierung vonhello(string, int)
. Wir wissen, dasshello(string, int)
beruht auf einer anderen Methode innerhalb dieser Klasse aufgerufenGetLastName()
.GetLastName()
s Umsetzung, wenn auch wichtig, nicht wichtig ist, um den Umfang von unit-Testshello(string, int)
. Aus diesem Grund, wir verspotten den Anruf und seiner Rückkehr - zum testen der Funktionalität vonhello(string, int)
ohne sich sorgen über Ihre Abhängigkeit Implementierung.Ich habe umgeben, die oben mit dem eigentlichen Klassennamen, um hoffentlich deutlicher machen, dass wir Spott der Klasse
MyProgram
und bietet eine neue Implementierung (mock)GetLastName()
Das gleiche Prinzip gilt, wenn Sie bauen Ihre unit-tests (vorausgesetzt, Sie sind Einheit tests, und nicht die integration-tests oder andere, Sie wollen immer konzentrieren sich auf Tests, die eine öffentliche Methode. Was ist der Unterschied zwischen unit-und integration tests?
Wenn wir unit-Tests
Bar()
wir kümmern uns nicht um die Umsetzung vonBaz(int)
oder noch schlimmerDoStuff(int)
. Hinweis wir kümmern uns nicht um die Umsetzung, wir tun darauf, dass Sie die Werte zurückgeben. VonBar()
s Sicht, die einzige Sache, die wichtig ist, ist dieBaz(int)
gibt einen string zurück. Was für Schnur? Es spielt keine Rolle, zuBar()
s Einheit test.Probe-test für
Bar()
:Beachten Sie in der oben, unsere aktuelle Implementierungen von
Baz(int)
, undDoStuff(int)
nicht egal, wie wir sind, ohne auf die tatsächliche Umsetzung vonBaz(int)
, undDoStuff(int)
gar nicht ins Spiel kommen.Nun, wenn wir testen
Baz(int)
Folgen wir einfach die gleiche Mentalität:In der oben, jetzt sind wir unit-Tests
Baz(int)
, wir kümmern uns nicht umBar()
, und das einzige, was wir über Pflege inDoStuff(int)
ist, dass es einen Wert zurückgibt (aber nicht wie es kommt an diesen Wert.)Und schließlich
DoStuff(int)
:Ich verstehe nicht, Ihre Frage, können Sie näher in die Frage mit Proben von dem, was Sie bedeuten?
Was bedeutet der parameter eigentlich bedeuten von Mock<??> Was soll das ?? werden? entschuldigen Sie mich, ich verstehe nicht ganz die syntax. Um zu klären, mock bedeutet, dass, wenn ich Pause Punkte in meinem code habe ich die Haltepunkte sollten überspringen Sie die Methoden, die ich spöttisch. Bin ich im Recht?
Danke für die Antwort. Was ist, wenn ich testen will, eine Methode ruft eine andere Methode ruft eine andere Methode? Für zB. was ist, wenn die Methode hello rief eine andere Methode?
Durch den Einsatz von virtuellen nur für die Zwecke der Spott eine Methode Sie sind zur Annahme gefährlicher code smells. Über eine Schnittstelle wäre hier sicherer.
InformationsquelleAutor Kritner