À l'aide de MOQ pour tester un référentiel
Je suis en train de tester un référentiel à l'aide de MOQ simuler le comportement de l'opération. Je suis failry nouveau de MOQ, alors pardonnez-moi s'il vous plaît.
Compte tenu de la méthode suivante:
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);
}
Ne ce test sont OK?
[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());
}
Me semble bon
Un bon moyen de tester qu'il fonctionne, c'est de commenter votre code et confirmer que le test échoue au point, puis d'inclure le code de nouveau et assurez-vous qu'il passe... c'est ce qui rend TDD une bonne approche car il agit à titre de vérification des tests que vous avez écrit.
Un bon moyen de tester qu'il fonctionne, c'est de commenter votre code et confirmer que le test échoue au point, puis d'inclure le code de nouveau et assurez-vous qu'il passe... c'est ce qui rend TDD une bonne approche car il agit à titre de vérification des tests que vous avez écrit.
OriginalL'auteur Sam | 2013-10-24
Vous devez vous connecter pour publier un commentaire.
Votre démarche est la bonne, cependant je voudrais régler quelques petites choses. J'ai fait quelques changements à votre test et se moquant de composants que vous pouvez voir ci-dessous.
De Test De L'Unité
Vous la méthode en cours de test au sein de votre Unité de Test (voir ci-dessous), n'a pas vraiment correspondre avec la méthode que vous avez défini dans votre question.
De test de l'unité de l'appel de méthode:
Méthode d'essai:
Je suppose que la méthode ci-dessus fait partie d'une autre classe, je l'ai appelé comme NotesHelper - Pas le nom idéal pour le dépôt des appels, mais c'est juste pour se la compilation de travail.
Je serais personnellement séparer de votre Unité de test dans 2 tests Unitaires. Vérifier si les méthodes sont appelées, et l'autre est de vérifier si les notes ont été supprimées de la collection.
Aussi au lieu de créer un moqué SubmissionVersion, j'ai créé un fakeSubmissionVersion.
C'est parce que les routines au sein de SubmissionVersion peut pas être mockable. Vous pouvez également faire un état des tests (de préférence) pour s'assurer de la version.Les Notes.Supprimer(note); il a été appelé.
Le test ci-dessus peuvent être encore améliorées par la définition de chacun de Vérification dans son propre test.
Cette façon, si un test échoue, nous saurons exactement la méthode qui n'a pas été appelé avec l'attente. Parfois, le fait d'avoir plusieurs vérifications ci-dessus peut être problématique. Par exemple, si la méthode n'a pas été appelé, vous ne le saurez jamais la Suppression de la méthode a été appelée ou non. C'est parce que l'exception a été levée lorsque la méthode d'enregistrement n'a pas été appelé et l'exécution du test a été résilié.
Cela aurait pour conséquence de multiples tests, mais ils sont à la fois plus lisible et maintenable. Bien sûr, vous pouvez refactoriser le code commun dans une usine ou de la méthode d'assistance.
Supplémentaires Remarque: Également en fournissant un descriptif de l'Unité de la méthode d'essai noms améliore la lisibilité des Tests Unitaires.
Pourriez-vous expliquer un peu plus pour moi:
You method under test within your Unit Test (see below), does not really match with the method which you have defined in your question.
pas de prob. C'était à propos de votre question a "Donné la méthode suivante" : public static SubmissionVersion DeleteNote(IRepository référentiel, SubmissionVersion version, Guid noteId) - je crois que c'est la méthode d'essais (Méthode d'Essai). Mais il n'était pas clair à quelle classe (Système Sous Test(SUT)) test de ciblage. Vous avez également ... nouveau Mock<SubmissionVersion>() Donc je ne pouvait pas déduire de ce qui est votre CIBLE, même votre test intention est claire. J'ai donc introduit NotesHelper (pas idéal car votre SUT.
OriginalL'auteur Spock