In einem unit-test, haben Sie nachzuweisen und geltend zu machen?
Ich bin mit Moq in meinem unit-test-Projekt. Die meisten unit-test-Beispiele, die ich gesehen habe online Ende mit someMock.VerifyAll();
ich Frage mich, ob es OK ist geltend zu machen, nachdem VerifyAll()
. So zum Beispiel,
//Arrange
var student = new Student{Id = 0, Name="John Doe", IsRegistered = false};
var studentRepository = new Mock<IStudentRepository>();
var studentService= new StudentService(studentRepository.Object);
//Act
studentService.Register(student); //<-- student.IsRegistered = true now.
//Verify and assert
studentRepository.VerifyAll();
Assert.IsTrue(student.IsRegistered);
Gedacht? Danke.
InformationsquelleAutor Stack0verflow | 2013-12-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie geltend zu machen.
VerifyAll()
wird behaupten, dass alleSetUp()
Anrufe wurden eigentlich genannt.VerifyAll()
nicht bestätigen, dass Ihr student-Objekt registriert ist. Da gibt es keineSetUp()
Anrufe in Ihrem Fall testen, ich denkeVerifyAll()
ist nicht alles überprüfen.InformationsquelleAutor mmilleruva
Nein sollten Sie nicht verwenden die beiden zusammen in den meisten Fällen(es gibt immer Ausnahmen). Der Grund dafür ist, sollten Sie testen nur eine Sache in Ihrem test für die Wartbarkeit, Lesbarkeit und paar andere Gründe. So sollte es sein, entweder Überprüfen(VerifyAll) oder Geltend machen, die in den test-und Sie geben Ihre tests entsprechend.
Blick auf Roy Osherove ' s Artikel darüber:
http://osherove.com/blog/2005/4/3/a-unit-test-should-test-only-one-thing.html
VerifyAll
wird verwendet, um sicherzustellen, dass bestimmte Methoden aufgerufen werden und wie oft. Verwenden Siemocks
.Assert
wird verwendet für die überprüfung das Ergebnis der Methode zurückgegeben, die Sie testen. Verwenden SieStubs
.Martin fowler hat einen tollen Artikel erklärt den Unterschied zwischen mocks und stubs. Wenn Sie das verstehen, werden Sie wissen, den Unterschied besser.
http://martinfowler.com/articles/mocksArentStubs.html
UPDATE: Beispiel für mock-vs-stub mit Moq, wie gewünscht, in den Kommentar unten. Ich habe verwendet, stellen Sie sicher, Sie können Sie aber verwenden, VerifyAll als gut.
Ich aktualisierte die Antwort mit einem Beispiel. Sie können sogar kopieren Sie diesen code und führen Sie es in einen unit-test-Datei in visual studio. Sie haben, um einen Verweis hinzuzufügen Moq Nuget-Paket
Als ich Lesen und testen, es scheint immer noch zu mir, dass, wenn wir Überprüfen oder VerifyAll, wir tun es auf mocks statt stubs. In anderen Worten, der verhöhnt in meinem ersten Codebeispiel sind wirklich mocks statt stubs. Was denkst du? Ich habe hier gelesen, DAMIT Moq-framework bewusst verwischt den Unterschied zwischen mocks und stubs. Ich poste die URL wenn ich ihn auszubuddeln.
Es hängt davon ab. Wenn Sie nur die Einstellung der IsRegistered, um wahr auf eine erfolgreiche Rückkehr des Objekts aus dem repository dann glaube ich nicht so. Aber wenn haben Sie keine Logik, auf deren Grundlage Sie es dann ja.
Dies sollte die akzeptierte Antwort.
InformationsquelleAutor Adarsh Shah
Ich würde es absolut zu erwarten, dass
Verify
undAssert
side-by-side in einem unit-test. Behauptet werden verwendet, um zu überprüfen, dass die Eigenschaften des Systems unter test korrekt festgelegt wurden, in der Erwägung, dassVerify
wird verwendet, um sicherzustellen, dass alle Abhängigkeiten, die Ihr system unter test dauert in genannt worden sind, richtig. Bei der Verwendung vonMoq
ich tendenziell irren auf der Seite der ausdrücklich die überprüfung einer Einrichtung, anstatt mit denVerifyAll
catch-all. Auf diese Weise können Sie stellen Sie den Zweck des Tests viel klarer.Ich nehme an, im code oben, dass Ihr Aufruf an die Studenten-repository gibt einen booleschen Wert zurück, zu behaupten, dass der student angemeldet ist? Und Sie legen Sie dann Wert auf die
student
Objekt? In diesem Fall, es ist eine wertvolle Einrichtung, die Hinzugefügt werden muss, in dem Sie wirksam sind, sagen, dass, wenn die Schüler repository-Methode aufgerufen wird, wird true zurückgegeben. DannAssert
dassstudent.IsRegistered
ist true, um sicherzustellen, dass Sie haben die Eigenschaft ordnungsgemäß festgelegt, aus dem repository Rückgabewert und SieVerify
an, dem der repository-Methode wird aufgerufen mit Eingaben, die Sie erwarten.InformationsquelleAutor levelnis
Gibt es nichts einzuwenden sei, sowohl mit der Geltendmachung und überprüfung in ein mocking-test, aber Behauptungen, die abhängig von der eigentlichen Methoden aufgerufen werden wahrscheinlich fehlschlagen, denn die mock-Methoden nicht die gleichen Wirkungen wie die echte Methoden.
In deinem Beispiel ist es wohl in Ordnung, da nur die repository verspottet wird, und die änderung der student Zustand ist vermutlich in den Dienst getan.
Ob die beiden nachzuweisen und geltend zu machen getan werden sollte, in der gleichen Prüfung ist in einem gewissen Grad eine Frage des Geschmacks. Wirklich überprüfen, ist zu prüfen, dass die richtigen Anrufe zu dem repository hergestellt werden, und die geltend machen, ist die Prüfung der ordnungsgemäßen änderung zu der Person gemacht wird. Wie sind diese voneinander zu trennen, würde ich Sie in gesonderten tests, aber das kann nur ich sein.
Es hängt davon ab, wie Sie die Struktur Ihrer tests. Wenn Sie Folgen einem BDD-style-syntax können Sie erstellen tests, die aus einem einzelnen Geltend zu machen.
Auch ohne BDD-style-syntax kann Refactoring test code, um Doppelarbeit zu beseitigen, nur so können Sie umgestalten Produktion von code. BDD-Stil ist aber auch schön!
InformationsquelleAutor Don Roby