53 votes

Rhino se moque de AssertWasCalled (plusieurs fois) sur la propriété de lecture à l'aide de AAA

J'ai un moqué de l'objet qui est passé en argument du constructeur à un autre objet.

Comment puis-je vérifier qu'un moqué de propriété de l'objet a été appelé? C'est le code j'utilise actuellement:

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

Cela fonctionne sauf quand dans le "someobject" de la lecture sur les Prénoms de la propriété est utilisée plusieurs fois. C'est alors que je reçois "Rhino.Des simulacres.Des Exceptions.ExpectationViolationException: INewContactAttributes.get_Forenames(); Attendu N ° 1, Réel #2.."

Simplement à l'aide de

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

ne fonctionne pas et donne l'erreur ci-dessous:

"L'attente a été retiré de l'attente attentes liste, avez-vous appeler Répéter.() ? Ce n'est pas pris en charge dans AssertWasCalled()."

Alors, comment dois-je répondre aux multiples appels?

27voto

Usman Points 1293

Je suis d'accord avec chris répondre

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

De plus, Si vous savez exactement combien de temps la propriété serait appelé vous pouvez faire

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

où n est un entier (int).

2voto

Garry Shutler Points 20898

Quelle est votre motivation derrière en vérifiant le nombre de fois qu'il est appelé? Il est particulièrement coûteux en fonctionnement? Si oui, alors je vous conseille de vous mettre derrière une méthode plutôt que, sémantiquement parlant, les propriétés doivent être peu coûteux appels.

Aussi, en vérifiant le nombre de fois qu'une propriété est appelée n'est pas la poussée de tests unitaires (ne vous inquiétez pas, c'est une erreur de test trop, nous avons tous été là). Ce que vous devriez vraiment être de test est que compte tenu de l'état de votre objet fantaisie que la méthode produit le résultat attendu. Le nombre de fois qu'une méthode est appelée à faire qui n'a pas vraiment d'importance (sauf si c'est un service pour envoyer un e-mail ou quelque chose). C'est un détail d'implémentation qui vous le feriez normalement pas de test comme un simple refactoriser de casser vos tests car ils seraient trop spécifiques.

2voto

vanslly Points 2219

Selon votre version de Rhino que vous utilisez, vous pouvez utiliser:

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

0voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X