Mit MOQ auf test-repository
Ich bin versuchen zu testen, ein repository mit MOQ, zu verhöhnen, das Verhalten der repo. Ich bin failry neu MOQ, so mit mir tragen, bitte.
Angesichts der folgenden Methode:
public static SubmissionVersion DeleteNote(IRepository repository, SubmissionVersion version, Guid noteId)
{
Note note = repository.GetById<Note>(noteId);
version.Notes.Remove(note);
repository.Save(version);
repository.Delete(note);
return repository.GetById<SubmissionVersion>(version.Id);
}
Ist dieser test OK Aussehen?
[Fact]
public void DeleteNoteV2()
{
//Arrange
var note = new Note{ Id = Guid.NewGuid()};
var subVersion = new Mock<SubmissionVersion>();
subVersion.Setup(x => x.Notes.Remove(note));
var repo = new Mock<IRepository>();
repo.Setup(x => x.GetById<Note>(note.Id)).Returns(note);
repo.Setup(x => x.GetById<SubmissionVersion>(It.IsAny<Guid?>())).Returns(subVersion.Object);
//Act
SubmissionVersion.DeleteNote(repo.Object, subVersion.Object, note.Id.Value);
//Assert
repo.Verify(x => x.GetById<Note>(note.Id), Times.Once());
repo.Verify(x => x.Save(subVersion.Object), Times.Once());
repo.Verify(x => x.Delete(note), Times.Once());
subVersion.Verify(x => x.Notes.Remove(It.IsAny<Note>()), Times.Once());
}
Sieht gut aus für mich
Ein guter Weg, um zu testen, ob es funktioniert, ist, kommentieren Sie Ihren code ein und bestätigen Sie, dass der test scheitert an der erwarteten Stelle, dann den code erneut aus, und stellen Sie sicher, dass es geht... das macht TDD einen so guten Ansatz, da es wirkt wie eine überprüfung des tests schreiben Sie auch.
Ein guter Weg, um zu testen, ob es funktioniert, ist, kommentieren Sie Ihren code ein und bestätigen Sie, dass der test scheitert an der erwarteten Stelle, dann den code erneut aus, und stellen Sie sicher, dass es geht... das macht TDD einen so guten Ansatz, da es wirkt wie eine überprüfung des tests schreiben Sie auch.
InformationsquelleAutor Sam | 2013-10-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein Ansatz ist gut, allerdings würde ich paar Dinge anpassen. Ich machte einige änderungen an Ihrer test-und mocking-Komponenten, die Sie unten sehen können.
Unit-Test
Du zu testende Methode innerhalb Ihrer Unit-Test (siehe unten), nicht wirklich überein mit der Methode, die Sie definiert haben, in Ihre Frage.
Unit-test-Aufruf der Methode:
Methode testen unter:
Ich nehme an, die oben genannte Methode ist ein Teil einer anderen Klasse ist, ich nannte es als NotesHelper - Nicht der ideale name für das repository nennt, aber es ist nur, um die Zusammenstellung zu arbeiten.
Würde ich persönlich trennen sich Ihre Unit-test in 2 separate Unit-tests. Ein, um zu überprüfen, ob die benötigten Methoden aufgerufen wird, und der andere ist zu überprüfen, ob die Noten wurden aus der Sammlung entfernt.
Auch statt der Schaffung einer verspottet SubmissionVersion, ich habe eine fakeSubmissionVersion.
Dies ist, weil die Routinen in SubmissionVersion kann nicht mockable. Sie können auch eine state-based testing (bevorzugt), um sicherzustellen, die version.Notizen.Remove(Notiz); aufgerufen wurde.
Dem obigen test kann weiter verbessert werden durch die Definition jeder Prüfung im eigenen test.
Diese Weise, wenn ein test fehlschlägt, würden wir genau wissen, welche Methode wurde nicht genannt mit der Erwartung. Manchmal, nachdem mehrere Kontrollen, wie oben, kann problematisch sein. Zum Beispiel, wenn die Save-Methode nicht aufgerufen wurde, würden Sie nie wissen, die Delete-Methode aufgerufen wurde oder nicht. Dies ist da die Ausnahme wurde ausgelöst, wenn die Save-Methode nicht aufgerufen wurde und die Testausführung beendet wurde.
Dies hätte zur Folge, mehrere tests, aber Sie sind besser lesbar und wartbar. Natürlich können Sie überarbeiten Sie den gemeinsamen code in eine Fabrik oder eine helper-Methode.
Zusätzlicher Hinweis: Auch die Bereitstellung einer aussagekräftigen Einheit Prüfmethode Namen verbessert die Lesbarkeit der Unit-Tests.
Könnten Sie erklären, ein wenig mehr für mich:
You method under test within your Unit Test (see below), does not really match with the method which you have defined in your question.
kein prob. Das war über Ihre Frage "Gegeben, die folgende Methode" : public static SubmissionVersion DeleteNote(IRepository repository, SubmissionVersion version, Guid noteId) - ich glaube, das ist die Methode, die Sie testen (Method Under Test). Aber war nicht klar, welche Klasse (System Unter Test(SUT)) Ihre test-targeting. Haben Sie auch ... neue Mock<SubmissionVersion> (), So konnte ich nicht ableiten, was sich Ihr SUT, auch Ihre test-Absicht ist klar. So stellte ich NotesHelper (nicht ideal) als SUT.
InformationsquelleAutor Spock