web-dev-qa-db-fra.com

Comment vérifier que cette méthode N'A PAS été appelée dans Moq?

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());
429
alex

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."));
145
Dan Fish

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());
492
Dann

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());
}
40
Chris Marisic

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.

9
miha