Rhino Mocks AssertWasCalled (várias vezes) em getter propriedade através AAA
-
05-09-2019 - |
Pergunta
Eu tenho um objeto zombado que é passado como um argumento construtor para outro objeto.
Como posso testar se a propriedade de um objeto zombado foi chamado? Este é o código que estou usando atualmente:
INewContactAttributes newContact = MockRepository.GenerateMock<INewContactAttributes>();
newContact.Stub(x => x.Forenames).Return("One Two Three");
someobject.ConsumeContact(newContact);
newContact.AssertWasCalled(x => { var dummy = x.Forenames; });
Isso funciona, exceto quando dentro do "SomeObject" o getter em Nomes próprios propriedade é usada várias vezes. Isso é quando eu chegar "Rhino.Mocks.Exceptions.ExpectationViolationException: INewContactAttributes.get_Forenames (); esperados # 1, real # 2 .."
Simplesmente usando
newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Any());
não funciona e dá o erro abaixo:
"A expectativa foi removido da lista de espera expectativas, você ligou Repeat.Any ()? Isto não é suportado em AssertWasCalled ()."
Então, como faço para atender às várias chamadas?
Solução
newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce());
Repeat.Any
não funciona com AssertWasCalled
porque 0 conta como qualquer ... então se ele não foi chamado, o AsserWasCalled
voltaria mesmo verdade se ele não foi chamado.
Outras dicas
Eu concordo com a resposta chris
newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce());
Além disso, se você sabe exatamente quantas vezes a propriedade seria chamado você pode fazer
newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Times(n));
onde n é um int.
Qual é a sua motivação por trás verificar o número de vezes que ele é chamado? É uma operação particularmente caro? Se assim for, então eu sugiro que você colocá-lo atrás de um método em vez de, semanticamente falando, as propriedades devem ser chamadas de baixo custo.
Além disso, verificar o número de vezes que uma propriedade é chamada não é o impulso de teste de unidade (não se preocupe, é um erro comum para teste muito, todos nós estivemos lá). O que você realmente deve ser o teste é que, dado o seu estado de objeto de simulação que o método produz a saída esperada. O número de vezes que um método é chamado para fazer isso realmente não importa (a menos que seja um serviço para enviar um e-mail ou algo assim). É um detalhe de implementação que você normalmente não teste como um refactor simples iria quebrar seus testes como eles seria muito específico.
Dependendo da sua versão do Rhino você está usando, você pode usar:
// Call to mock object here
LastCall.IgnoreArguments().Repeat.Never();
newContact.Expect (c => c.ForeNames) .Return (...) .Repeat.Any ()
A partir Aqui :
mock.AssertWasCalled(x => x.Name ="Bob");
ou
mock.AssertWasCalled(x => x.Name =Arg.Is("Bob"));
ou
mock.AssertWasCalled(x => x.Name =Arg<string>.Is.NotNull);