c# unit-testing properties rhino-mocks getter

c# - Rhino se burla de AssertWasCalled(varias veces) en getter de propiedad usando AAA



unit-testing properties (6)

¿Cuál es su motivación detrás de verificar el número de veces que se llama? ¿Es una operación particularmente costosa? Si es así, sugiero que lo ponga detrás de un método, ya que, semánticamente hablando, las propiedades deberían ser llamadas de bajo costo.

Además, verificar el número de veces que se llama una propiedad no es el empuje de las pruebas unitarias (no se preocupe, es un error común probar demasiado, todos hemos estado allí). Lo que realmente debería probar es que, dado el estado de su objeto simulado, el método produce el resultado esperado. La cantidad de veces que se llama a un método para hacer eso realmente no importa (a menos que sea un servicio para enviar un correo electrónico o algo). Es un detalle de implementación que normalmente no probarías, ya que un simple refactorizador podría romper tus pruebas ya que serían demasiado específicas.

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

¿Cómo puedo probar que se ha llamado a la propiedad de un objeto burlado? Este es el código que estoy usando 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 del "algún objeto" la propiedad getter on Forenames se usa varias veces. Ahí es cuando obtengo "Rhino.Mocks.Exceptions.ExpectationViolationException: INewContactAttributes.get_Forenames (); Expected # 1, Real # 2 .."

Simplemente usando

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

no funciona y da el siguiente error:

"La expectativa fue eliminada de la lista de expectativas de espera, ¿llamó a Repeat.Any ()? Esto no es compatible con AssertWasCalled ()".

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


Desde Here :

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);


Estoy de acuerdo con la respuesta de Chris

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

Además, si sabe exactamente cuántas veces se llamaría la propiedad, puede hacer

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

donde n es un int.


Según la versión de Rhino que esté utilizando, puede usar:

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


newContact.Expect (c => c.ForeNames) .Return (...) .Repeat.Any ()


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

Repeat.Any no funciona con AssertWasCalled porque 0 cuenta como cualquier ... así que si no se llamaba, el AsserWasCalled devolvería TRUE incluso si no se llamaba.