Como posso verificar se um método foi chamado exatamente uma vez com o Moq? A coisa Verify()
vs. Verifable()
é realmente confusa.
112
Você pode usar Times.Once()
, ou Times.Exactly(1)
:
mockContext.Verify(x => x.SaveChanges(), Times.Once());
mockContext.Verify(x => x.SaveChanges(), Times.Exactly(1));
Aqui estão os métodos da classe Times :
AtLeast
- Especifica que um método simulado deve ser invocado vezes, no mínimo.AtLeastOnce
- Especifica que um método simulado deve ser chamado pelo menos uma vez.AtMost
- Especifica que um método simulado deve ser invocado vezes no máximo.AtMostOnce
- Especifica que um método simulado deve ser chamado uma vez, no máximo.Between
- Especifica que um método simulado deve ser chamado entre os horários de e para.Exactly
- Especifica que um método simulado deve ser chamado exatamente vezes.Never
- Especifica que um método simulado não deve ser chamado.Once
- Especifica que um método simulado deve ser chamado exatamente uma vez.Lembre-se de que são chamadas de método; Eu ficava tropeçando, pensando que eram propriedades e esquecendo os parênteses.
var mockContext = new Mock<IContext>()
com isso.AtLeast
,AtMost
,Between
, ouExactly
poderia ser visto como propriedade. Quer dizer, eles obviamente precisam de um parâmetro para fazer algo.Imagine que estamos construindo uma calculadora com um método para adicionar 2 inteiros. Vamos imaginar ainda que o requisito é que, quando o método add é chamado, ele chama o método print uma vez. Aqui está como testaríamos isso:
E aqui está o teste real com comentários dentro do código para maiores esclarecimentos:
Nota : Por padrão, o Moq fará o stub de todas as propriedades e métodos assim que você criar um objeto Mock. Portanto, mesmo sem chamar
Setup
, o Moq já criou os métodos de paraIPrinter
que você possa apenas chamarVerify
. No entanto, como uma boa prática, sempre o configuro porque podemos precisar impor os parâmetros do método para atender a certas expectativas, ou o valor de retorno do método para atender a certas expectativas ou o número de vezes que ele foi chamado.fonte
Verify
,Times.Once
sem nunca ligarSetup
. Eu certamente esperariaVerify
explodir nesse caso, mas isso não aconteceu.Mock
objeto. Portanto, mesmo sem chamarSetup
, o Moq já criou os métodos de paraIPrinter
que você possa apenas chamarVerify
. No entanto, como uma boa prática, eu sempre o configuro porque pode ser necessário impor os parâmetros ao método ou o valor de retorno do método.Times.Exactly(1)
e não falhou quando o método foi de fato chamado duas vezes. Somente após adicionarSetup
para o método em questão, ele falhou corretamente.O controlador de teste pode ser:
E quando o método DeleteCars é chamado com um id válido, podemos verificar se o método Service remove chamado exatamente uma vez por este teste:
fonte