Pregunta

Tengo un objeto burlado que se pasa como argumento del constructor a otro objeto.

¿Cómo puedo probar que la propiedad de un objeto burlado ha sido llamado? Este es el código que estoy utilizando actualmente:

INewContactAttributes newContact = MockRepository.GenerateMock<INewContactAttributes>();
newContact.Stub(x => x.Forenames).Return("One Two Three");
someobject.ConsumeContact(newContact);
newContact.AssertWasCalled(x => { var dummy = x.Forenames; });

Esto funciona excepto cuando dentro de la "someObject" del captador en la propiedad de nombres de pila se utiliza varias veces. Fue entonces cuando me sale "Rhino.Mocks.Exceptions.ExpectationViolationException: INewContactAttributes.get_Forenames (); esperado # 1, # 2 .. real"

Simplemente utilizando

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Any());

no funciona y da el error a continuación:

"La expectativa fue retirado de la lista de espera expectativas, has llamado Repeat.Any ()? Esto no está soportado en AssertWasCalled ()."

Entonces, ¿cómo atender a las múltiples llamadas?

¿Fue útil?

Solución

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce());

Repeat.Any no funciona con AssertWasCalled porque 0 cuenta como ninguna ... lo que si no se llamaba, la AsserWasCalled volverían cierto incluso si no fue llamado.

Otros consejos

Estoy de acuerdo con la respuesta Chris

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce());

Además, si usted sabe exactamente cuántas veces la propiedad sería llamada que puede hacer

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Times(n));

donde n es un int.

¿Cuál es su motivación detrás de comprobar el número de veces que se llama? Es una operación particularmente caro? Si es así, entonces yo sugeriría que se pone detrás de un método en su lugar ya que, semánticamente hablando, las propiedades deben ser llamadas a bajo costo.

Además, comprobando el número de veces que una propiedad se llama no es la idea central de la unidad de pruebas (no se preocupe que es un error común para probar demasiado, todos hemos estado allí). Lo que realmente debe ser la prueba es que, dado el estado de su objeto de burla que el método produce el resultado esperado. El número de veces que un método es llamado a hacer eso en realidad no importa (a menos que sea un servicio para enviar un correo electrónico o algo así). Es un detalle de implementación que normalmente no probar como refactor simple podría romper sus pruebas, ya que sería demasiado específico.

Dependiendo de la versión de Rhino está utilizando, puede utilizar:

// Call to mock object here
LastCall.IgnoreArguments().Repeat.Never();

newContact.Expect (c => c.ForeNames) de vuelta se (...) .Repeat.Any ()

Aquí :

mock.AssertWasCalled(x => x.Name ="Bob");

o

mock.AssertWasCalled(x => x.Name =Arg.Is("Bob"));

o

mock.AssertWasCalled(x => x.Name =Arg<string>.Is.NotNull);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top