¿Cómo verificar que ese método NO fue llamado en Moq?

Resuelto alex asked hace 15 años • 8 respuestas

¿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());
alex avatar Feb 11 '09 22:02 alex
Aceptado

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());
Dan avatar Aug 05 '2010 10:08 Dan

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."));
Dan Fish avatar Feb 11 '2009 16:02 Dan Fish

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);
}
Chris Marisic avatar Mar 16 '2010 20:03 Chris Marisic

Esto no funciona en versiones recientes de Moq (desde al menos la 3.1), debe especificarse en el Verifymé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.

miha avatar Feb 19 '2009 09:02 miha

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:

  1. Verificar que se realizaron todas las llamadas esperadas
  2. 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
MarredCheese avatar Feb 07 '2022 02:02 MarredCheese