Respostas:
ATUALIZAÇÃO : Desde a versão 3, verifique a atualização da pergunta acima ou a resposta de Dann abaixo.
Ou, faça com que o seu mock seja estrito, para que ele falhe se você chamar um método para o qual você não espera
new Mock<IMoq>(MockBehavior.Strict)
Ou, se você quiser que seu mock seja solto, use o .Throws (Exception)
var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));
Execute uma verificação após o teste com um Times.Never
conjunto de enumerações. por exemplo
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());
Roubado de: John Foster respondeu à pergunta "Precisa de ajuda para entender melhor o Moq"
Uma das coisas que você pode querer testar é que o método de pagamento não é chamado quando uma pessoa com mais de 65 anos passa para o método
[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()); }
Isso não funciona nas versões recentes do Moq (desde pelo menos 3,1), ele deve ser especificado no
Verify
método conforme mencionado na resposta.
Na verdade, é melhor especificar .AtMost(0)
após a instrução Returns.
var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
Embora os "lances" também funcionem, AtMost(0)
é IMHO mais expressivo.
Use .AtMostOnce ();
Após o teste real, chame o método novamente. Se lançar uma exceção, foi chamado.