2010-01-13 6 views
10

Utilisation de RhinoMocks - puis-je récupérer les paramètres d'une fonction appelée? Je veux dire; puis-je obtenir certains des paramètres inconnus de la fonction appel?RhinoMocks - Récupération des paramètres des fonctions appelées

J'ai un simulacre, et je m'attends à ce que certaines fonctions soient appelées à ce sujet. Je connais l'un des paramètres, mais l'autre est inconnu car cela vient de la classe qui utilise le mock et appelle une fonction dessus. Plus précisément - dans ce cas - l'argument inconnu est une fonction lambda. C'est une fonction de rappel qui est supposée être appelée lorsque la fonction est terminée. Comme le faux empêche le rappel d'être appelé, je veux le chercher et l'appeler moi-même.

Ainsi; Je veux vérifier que la fonction a été appelée. Je veux m'assurer que certains des arguments étaient les attendus. Et je veux sortir les arguments inconnus pour faire quelques opérations sur eux après.

supposer que les deux arguments sont ints (pour simplifier) ​​Je voudrais faire quelque chose comme ceci:

int unknownInt; 
_fakeSomething.AssertWasCalled(factory => factory.Foo(1, out unknownInt)); 
// then play around with unknownInt.. 

peut-il être fait? Je vois qu'il y a un Arg.Out, mais ne pourrait pas tout à fait le faire fonctionner.

Note: Mis à jour la question car elle a semblé être trompeuse.

Répondre

14
Arg<string>.Matches(arg => you got the argument here...); 

MISE À JOUR:

Pour récupérer le second argument sur le premier appel de la méthode Foo sur _fakeSomething:

string someArg = null; 
var args = _fakeSomething.GetArgumentsForCallsMadeOn(
    x => x.Foo(0, 0), 
    x => x.IgnoreArguments() 
); 
var int = (int)args[0][1]; 
+0

Merci. Mais d'après ce que j'ai compris, c'est un match simple? Ou puis-je l'utiliser pour aller chercher l'argument? Je veux aller chercher l'argument. Ma question aurait pu être trompeuse, alors j'ai mis à jour le texte de ma question. – stiank81

+0

Maintenant, c'est plus clair, voir ma mise à jour. –

+0

C'est tout! Merci! – stiank81

0

Je ne sais pas si cela peut être fait, mais les tests comme cela peut entraîner des tests peu fiables, que vous ne connaissez pas la paramter réelle qui a été passé.

Si possible, tester sur des données explicites. Si vous f.eks passer en null au lieu d'une valeur réelle votre test passera probablement pour la mauvaise raison.

Test avec Arg.Is.Tout devrait être fait avec soin et lorsque vous ne vous souciez pas vraiment du paramètre, comme dans AssertWasNotCalled.

+0

Je ne suis pas d'accord avec vous. Pour citer un exemple, j'ai un proxy de service que je Mock. J'injecte ce proxy de service lors de la création d'un objet foo d'une classe qui l'utilisera. J'appelle ensuite une fonction sur l'objet foo, et je m'attends à ce que cette fonction appelle une fonction sur le proxy de service avec certains arguments que j'attends, et aussi une fonction de rappel qui est privée à la classe. Maintenant, je veux vérifier que la fonction a été appelée avec les arguments attendus, mais je ne peux pas vérifier le callback privé, et donc spécifier Arg.Is.Anything. Je me fous de cet argument, alors pourquoi pas moi? – stiank81

+1

Ahh je vois. J'ai eu aussi du mal à tester les rappels et les lambdas. Je suis arrivé à la conclusion que mon design était mauvais. La plus belle chose à propos des tests, et en particulier TDD est qu'il vous indique quand votre conception est fausse. Que votre conception soit mauvaise ou non, je ne peux pas vous le dire, mais si vous trouvez que votre code est difficile à tester, vous devriez peut-être reconsidérer votre conception. – Henning

Questions connexes