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.