Question

I ai un objet moqué qui est passé comme argument de constructeur à un autre objet.

Comment puis-je tester qui a été appelé la propriété d'un objet moqué? Ceci est du code Je suis actuellement en utilisant:

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 si dans le « SomeObject » le getter sur la propriété est utilisé plusieurs prénoms fois. C'est quand je reçois "Rhino.Mocks.Exceptions.ExpectationViolationException: INewContactAttributes.get_Forenames (); attendu # 1, # 2 .. réelle"

Il suffit en utilisant

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 la liste des attentes d'attente, avez-vous appelé Repeat.Any ()? Non pris en charge dans AssertWasCalled (). »

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

Était-ce utile?

La solution

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

Repeat.Any ne fonctionne pas avec AssertWasCalled parce que 0 compte comme tout ... donc s'il n'a pas été appelé, le AsserWasCalled retournerait TRUE même si elle n'a pas été appelé.

Autres conseils

Je suis d'accord avec la réponse chris

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

En outre, si vous savez exactement combien de fois la propriété serait appelé que vous pouvez faire

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

où n est un entier.

Quelle est votre motivation de vérifier le nombre de fois qu'il est appelé? Est-ce une opération particulièrement coûteuse? Si oui, alors je vous suggère de le mettre derrière une méthode plutôt que, sémantiquement parlant, les propriétés doivent être des appels bon marché.

En outre, vérifier le nombre de fois qu'une propriété est appelée est pas la poussée des tests unitaires (ne nous avons tous été là vous inquiétez pas, il est une erreur commune pour tester trop). Ce que vous devez vraiment être le 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 à le faire ne compte pas vraiment (à moins que c'est un service pour envoyer un e-mail ou quelque chose). Il est un détail de mise en œuvre que vous feriez normalement pas tester comme un simple refactor briserait vos tests car ils seraient trop spécifiques.

En fonction de votre version de Rhino que vous utilisez, vous pouvez utiliser:

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

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

De :

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top