¿Cómo verificar que ese método NO fue llamado en Moq?
¿Cómo verifico que ese método NO fue llamado en Moq ?
¿Tiene algo como AssertWasNotCalled?
ACTUALIZACIÓN: A partir de la versión 3.0, se puede utilizar una nueva sintaxis:
mock.Verify(foo => foo.Execute("ping"), Times.Never());
Ejecute una verificación después de la prueba con la Times.Never()
opción.
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(), Times.Never());
ACTUALIZACIÓN : Desde la versión 3, consulte la actualización de la pregunta anterior o la respuesta de Dann a continuación.
O haga que su simulacro sea estricto para que falle si llama a un método para el cual no tiene expectativas.
new Mock<IMoq>(MockBehavior.Strict)
O, si desea que su simulacro sea suelto, use .Throws( Exception )
var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));
Robado de: Respuesta de John Foster a la pregunta "Necesita ayuda para comprender mejor Moq"
Una de las cosas que quizás quieras probar es que no se llama al método de pago cuando una persona mayor de 65 años ingresa 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 la 3.1), debe especificarse en el
Verify
método como se menciona en la respuesta.
En realidad, es mejor especificarlo .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 el "tiro" también funciona, AtMost(0)
es más expresivo en mi humilde opinión.
Usando VerifyNoOtherCalls
(requiere Moq 4.8 o posterior)
Esta respuesta es un enfoque indirecto. En lugar de verificar que no se llamó a un método en particular, verifica que no se realizaron llamadas inesperadas en general.
Considere que una prueba exhaustiva de un simulacro hace 2 cosas:
- Verificar que se realizaron todas las llamadas esperadas
- Verificar que no se realizaron llamadas inesperadas
Si ya estás realizando el paso 1, agregar el paso 2 es trivial:
// Step 1 (if relevant - see note below)
mock.Verify(..., Times.Exactly(2));
mock.Verify(..., Times.Once());
// ...
// Step 2
mock.VerifyNoOtherCalls();
Notas
- Si omite el paso 1, el paso 2 simplemente garantizará que no se realice ninguna llamada al simulacro.
- Esto no requiere una burla estricta.
- Fuente: Inicio rápido de Moq