¿Cómo verifico que se haya llamado a un método exactamente una vez con Moq? La cosa Verify()
vs. Verifable()
es realmente confusa.
112
Puede usar Times.Once()
, o Times.Exactly(1)
:
mockContext.Verify(x => x.SaveChanges(), Times.Once());
mockContext.Verify(x => x.SaveChanges(), Times.Exactly(1));
Estos son los métodos de la clase Times :
AtLeast
- Especifica que un método simulado debe invocarse veces como mínimo.AtLeastOnce
- Especifica que un método simulado debe invocarse una vez como mínimo.AtMost
- Especifica que un método simulado debe invocarse por tiempo como máximo.AtMostOnce
- Especifica que un método simulado debe invocarse una vez como máximo.Between
- Especifica que se debe invocar un método simulado entre las horas desde y hasta.Exactly
- Especifica que un método simulado debe invocarse exactamente las veces.Never
- Especifica que no se debe invocar un método simulado.Once
- Especifica que un método simulado debe invocarse exactamente una vez.Recuerde que son llamadas a métodos; Seguí tropezando, pensando que eran propiedades y olvidándome del paréntesis.
var mockContext = new Mock<IContext>()
configurar eso.AtLeast
,AtMost
,Between
, oExactly
podría ser visto como una propiedad. Quiero decir, obviamente necesitan un parámetro para hacer algo.Imagina que estamos construyendo una calculadora con un método para sumar 2 enteros. Imaginemos además que el requisito es que cuando se llama al método add, llama al método print una vez. Así es como probaríamos esto:
Y aquí está la prueba real con comentarios dentro del código para mayor aclaración:
Nota : De forma predeterminada, Moq eliminará todas las propiedades y métodos tan pronto como cree un objeto Mock. Entonces, incluso sin llamar
Setup
, Moq ya ha eliminado los métodos paraIPrinter
que pueda llamarVerify
. Sin embargo, como buena práctica, siempre lo configuro porque es posible que necesitemos hacer cumplir los parámetros del método para cumplir con ciertas expectativas, o el valor de retorno del método para cumplir con ciertas expectativas o la cantidad de veces que se ha llamado.fuente
Verify
,Times.Once
sin llamar nuncaSetup
. Ciertamente esperaríaVerify
explotar en ese caso, pero no fue así.Mock
objeto. Entonces, incluso sin llamarSetup
, Moq ya ha eliminado los métodos paraIPrinter
que pueda llamarVerify
. Sin embargo, como buena práctica, siempre lo configuro porque es posible que necesitemos aplicar los parámetros al método o el valor de retorno del método.Times.Exactly(1)
y no falló cuando el método se llamó dos veces. Solo después de agregarSetup
el método en cuestión, falló correctamente.El controlador de prueba puede ser:
Y cuando se llama al método DeleteCars con una identificación válida, entonces podemos verificar que, el método de eliminación del servicio se llama exactamente una vez por esta prueba:
fuente