Risposte:
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."));
Esegui una verifica dopo il test che ha un Times.Never
enum set. per esempio
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());
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()); }
Questo non funziona nelle ultime versioni di Moq (almeno dal 3.1), dovrebbe essere specificato nel
Verify
metodo 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.
Usa .AtMostOnce ();
Dopo il vero test, chiama nuovamente il metodo. Se genera un'eccezione, è stato chiamato.