Respuestas:
ACTUALIZACIÓN : desde la versión 3, verifique la actualización de la pregunta anterior o la respuesta de Dann a continuación.
O bien, haga que su simulación sea estricta para que falle si llama a un método para el que no tiene expectativas
new Mock<IMoq>(MockBehavior.Strict)
O, si quieres que tu simulacro se suelte, usa .Throws (Excepción)
var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));
Ejecute una verificación después de la prueba que tiene una Times.Never
enumeración establecida. p.ej
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());
Robado de: la respuesta de John Foster a la pregunta, "Necesito ayuda para entender mejor a Moq"
Una de las cosas que es posible que desee probar es que no se llama al método de pago cuando una persona mayor de 65 años pasa al 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()); }
Esto no funciona en versiones recientes de Moq (desde al menos 3.1), debe especificarse en el
Verify
método como se menciona en la respuesta.
En realidad, es mejor especificar .AtMost(0)
después de la declaración de Devoluciones.
var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
Aunque los "tiros" también funcionan, AtMost(0)
es más expresivo en mi humilde opinión.
Utilice .AtMostOnce ();
Después de la prueba real, llame al método nuevamente. Si arroja una excepción, se llamó.