Come verificare che il metodo NON sia stato chiamato in Moq?


466

Come posso verificare che il metodo NON sia stato chiamato in Moq ?

Ha qualcosa come AssertWasNotCalled?

AGGIORNAMENTO: a partire dalla versione 3.0, è possibile utilizzare una nuova sintassi:

mock.Verify(foo => foo.Execute("ping"), Times.Never());

Risposte:


155

AGGIORNAMENTO : Dalla versione 3, controlla l'aggiornamento alla domanda sopra o la risposta di Dann sotto.

In ogni caso, rendi rigoroso il tuo finto in modo che fallisca se chiami un metodo per il quale non hai aspettative

new Mock<IMoq>(MockBehavior.Strict)

Oppure, se vuoi che il tuo finto sia libero, usa .Throws (eccezione)

var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));

9
... o Callback () per impostare alcuni flag che possono essere asseriti.
alex,

2
Inoltre, con l'opzione n. 2, non è possibile avere un VerifyAll in un metodo generale di smontaggio - non riuscirà a dire che l'aspettativa non è stata soddisfatta; quando il test dovrebbe idealmente superare.
Gishu,

51
Questa non è in realtà una "verifica non chiamata" in quanto potrebbe essere catturata dal metodo e funzionerebbe ancora - fornendo un falso positivo!
Dan,

4
L'aspettativa è ora obsoleta
Tomasz Sikora,

5
Questo potrebbe essere stato il modo migliore possibile nel 2009, ma certamente non ora. scusa
Fabio Milheiro,

537

Esegui una verifica dopo il test che ha un Times.Neverenum set. per esempio

_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());

4
La cosa fondamentale qui è che la chiamata di verifica (azione, mai) è dopo l'invocazione alla simulazione. Ho pensato che stesse impostando la verifica per chiamare VerifyAll () in seguito (che non funziona)
piers7

Semplice ed efficace Grazie.
Ian Grainger,

45

Rubato da: la risposta di John Foster alla domanda "Hai bisogno di aiuto per capire meglio Moq"

Una delle cose che potresti voler testare è che il metodo di pagamento non viene chiamato quando una persona di età superiore ai 65 anni viene passata nel metodo

[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());
}

10

Questo non funziona nelle ultime versioni di Moq (almeno dal 3.1), dovrebbe essere specificato nel Verifymetodo come indicato nella risposta.

In realtà, è meglio specificare .AtMost(0)dopo l'istruzione Returns.

var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);

Anche se i "tiri" funzionano anche, AtMost(0)IMHO è più espressivo.


-5

Usa .AtMostOnce ();

Dopo il vero test, chiama nuovamente il metodo. Se genera un'eccezione, è stato chiamato.


1
Non è un po 'troppo oscuro, affermare che l'eccezione è stata lanciata dal quadro beffardo?
alex,

Perché? Basta controllare il tipo di eccezione. Se viene lanciato il mio Moq, sei al sicuro.
Aaron Digulla,

8
Usare Verify con Times.Never è una scelta migliore ... Sono d'accordo con alex sul fatto che questa soluzione funzioni, ma è decisamente oscura.
Segnale acustico
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.