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.