¿Cómo verificar que el método no fue llamado en Moq?


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

¿Tiene algo como AssertWasNotCalled?

ACTUALIZACIÓN: A partir de la versión 3.0, se puede usar una nueva sintaxis:

mock.Verify(foo => foo.Execute("ping"), Times.Never());
 392
Author: John Saunders, 2009-02-11

5 answers

ACTUALIZACIÓN: Desde la versión 3, verifique la actualización a la pregunta anterior o la respuesta de Dann a continuación.

O bien, haga su mock strict para que falle si llama a un método para el que no tiene un expect

new Mock<IMoq>(MockBehavior.Strict)

O, si quieres que tu burla esté suelta, usa el .Lanzamientos (Excepción)

var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));
 138
Author: Dan Fish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-29 14:56:47

Ejecute una verificación después de la prueba que tiene un conjunto de enumeraciones Times.Never. por ejemplo,

_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());
 448
Author: Dann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-08 09:59:37

Robado de: La respuesta de John Foster a la pregunta,"Necesito ayuda para entender mejor Moq"

Una de las cosas que podrías querer probar es que el método de pago no recibe una llamada cuando una persona mayor de 65 años pasa a la 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());
}
 29
Author: Chris Marisic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-01 15:35:19

Esto no funciona en versiones recientes de Moq (desde al menos 3.1), debe especificarse en el método Verify como se menciona en el respuesta.

En realidad, es mejor especificar .AtMost(0) después de la instrucción Returns.

var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);

Aunque el "lanza" también funciona, AtMost(0) es más expresivo EN mi humilde opinión.

 10
Author: miha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-11 11:41:27

Uso .AtMostOnce ();

Después de la prueba real, llame al método de nuevo. Si lanza una excepción, se llama.

 -4
Author: Aaron Digulla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-11 15:59:01