Comment puis-je vérifier que cette méthode n'a PAS été appelée Moq ?
At-il quelque chose comme AssertWasNotCalled?
UPDATE: A partir de la version 3.0, une nouvelle syntaxe peut être utilisée:
mock.Verify(foo => foo.Execute("ping"), Times.Never());
UPDATE: Depuis la version 3, vérifiez la mise à jour de la question ci-dessus ou la réponse de Dann ci-dessous.
Soit, faites que votre maquette soit stricte pour qu’elle échoue si vous appelez une méthode pour laquelle vous n’avez pas d’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 ensemble Times.Never
enum. 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"
Une des choses que vous voudrez peut-être tester est que la méthode de paye n'est pas appelée quand une personne de plus de 65 ans est passée à 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 la version 3.1), il convient de le spécifier dans la méthode
Verify
comme indiqué 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 "lancer" fonctionne également, AtMost(0)
est plus expressif à mon humble avis.