2009-06-11 6 views
87

Quel est l'objectif de Verifiable()?Quel est l'objectif de Verifiable() dans Moq?

Si je vérifie un Mock et le laisse dehors il vérifie toujours le SetUp.

Édition: J'utilisais VerifyAll() donc la raison de tout ce qui était vérifié. Après avoir changé en Verify(), seuls mes .Verifiable()SetUp étaient en cours de vérification.

Répondre

57

ADDENDA: Comme les autres états de réponse, le but de .Verifiable est d'engager un Setup dans un ensemble de « différés » Verify(...) appels qui peuvent alors être déclenchées par mock.Verify(). La clarification de l'OP montre clairement que c'était le but et le seul problème était de comprendre pourquoi ça ne fonctionnait pas, mais comme @Liam poussé, la réponse devrait vraiment toucher à cela aussi: - L'utilisation de la clé cas pour autant que je peux voir sont:

  • maintenant sec entre un mock.Setup() et mock.Verify
  • permettant une déconnecter la configuration d'une vérification de l'appel Verify réel lui-même (par exemple, vous pouvez le configurer dans un autre méthode auxiliaire)

... et de nouveau à ma réponse, qui dit effectivement "attention car les avantages ci-dessus sont généralement considérés comme compensés par l'effet que la réalisation de ces objectifs a sur la lisibilité et la maintenabilité des tests qui s'appuient trop sur de telles constructions »

ORIGINAL: Notez que si possible, il faut suivre plutôt la mise en page AAA et donc il faut être doing explicit mock.Verify(expression) calls after the work has been done, rather than a mock.Setup(...).Verifiable() paired with a mock.Verify() or mock.VerifyAll() autant que possible (crédit: @kzu).

+0

Pour clarifier - Si j'ai besoin d'un simulacre pour retourner quelque chose au code sous test, est-ce un cas où 'Setup (...)' (dans ma section d'arrangement) et 'VerifyAll()' (dans mon assert section) serait approprié? –

+5

@EricSmith En y repensant, ne pense pas que je le mets assez fort. Il y a énormément plus d'avantages à diviser votre travail en regroupement AAA que de surconcentration sur les points communs entre la phase Arrangement et Assertion. 90% du temps, il y a quelque chose à gagner des nuances de la façon dont vous exprimez les appels Verify à la fin, donc vous devriez prendre beaucoup de temps pour optimiser cela, même si dans certains cas, cela ressemble à une duplication douloureuse. L'un des points sur http://manning.com/osherove fait très bien, c'est que faire un test a du sens pour quelqu'un de sauter est essentiel, alors respectez la convention! –

+2

Je ne suis normalement pas du genre à aller à l'encontre de la sagesse acceptée mais je ne suis pas encore convaincu des avantages de AAA par rapport à 'Verifyable()'/'VerifyAll()' dans tous les cas. Mon test d'unité actuel comporte un grand nombre d'appels 'Setup (...)' (> 30). Pourrait correspondre à chacun avec un équivalent Verify() pour satisfaire la convention, mais cela entraîne une grande quantité de duplication de code et sera plus difficile à maintenir et à lire à mesure que le nombre de tests unitaires augmente. Je suppose que ce que je demande vraiment est que des exceptions peuvent être faites s'il y a un grand nombre d'arrangements ou est-ce que l'évitement de 'Verifiable()' est une règle dure et rapide? –

39

Lorsque la méthode Verify() est appelée à la fin du test, si l'une des attentes marquées comme vérifiables n'a pas été appelée, une exception est thrown.

VerifyAll() ne vérifie pas les attentes vérifiables.