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?

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top