¿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, oExactlypodrí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 paraIPrinterque 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.Oncesin llamar nuncaSetup. Ciertamente esperaríaVerifyexplotar en ese caso, pero no fue así.Mockobjeto. Entonces, incluso sin llamarSetup, Moq ya ha eliminado los métodos paraIPrinterque 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 agregarSetupel 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