Réponses:
MISE À JOUR : Depuis la version 3, vérifiez la mise à jour de la question ci-dessus ou la réponse de Dann ci-dessous.
Soit, rendez votre maquette stricte afin qu'elle échoue si vous appelez une méthode pour laquelle vous n'avez aucune attente
new Mock<IMoq>(MockBehavior.Strict)
Ou, si vous voulez que votre maquette soit lâche, utilisez le .Throws (Exception)
var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));
Exécutez une vérification après le test qui a un Times.Never
ensemble d'énumérations. par exemple
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());
Volé à: Réponse de John Foster à la question "Besoin d'aide pour mieux comprendre Moq"
L'une des choses que vous voudrez peut-être tester est que la méthode de rémunération n'est pas appelée lorsqu'une personne âgée de plus de 65 ans est transmise à la méthode
[Test] public void Someone_over_65_does_not_pay_a_pension_contribution() { var mockPensionService = new Mock<IPensionService>(); var person = new Person("test", 66); var calc = new PensionCalculator(mockPensionService.Object); calc.PayPensionContribution(person); mockPensionService.Verify(ps => ps.Pay(It.IsAny<decimal>()), Times.Never()); }
Cela ne fonctionne pas dans les versions récentes de Moq (depuis au moins 3.1), cela devrait être spécifié dans la
Verify
méthode comme mentionné dans la réponse.
En fait, il est préférable de spécifier .AtMost(0)
après l'instruction Returns.
var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
Bien que le «jette» fonctionne également, AtMost(0)
est plus expressif à mon humble avis.
Utilisez .AtMostOnce ();
Après le vrai test, appelez à nouveau la méthode. S'il lève une exception, il a été appelé.