Est-il possible d'assigner un paramètre out
/ en ref
utilisant Moq (3.0+)?
J'ai regardé l'utilisation Callback()
, mais Action<>
ne prend pas en charge les paramètres ref car il est basé sur des génériques. J'aimerais aussi de préférence mettre une contrainte ( It.Is
) sur l'entrée du ref
paramètre, bien que je puisse le faire dans le rappel.
Je sais que Rhino Mocks prend en charge cette fonctionnalité, mais le projet sur lequel je travaille utilise déjà Moq.
It.IsAny<T>()
similaireref It.Ref<T>.IsAny
à la prise en charge de la configuration.Callback()
et.Returns()
via un type de délégué personnalisé correspondant à la signature de la méthode. Les méthodes protégées sont également prises en charge. Voir par exemple ma réponse ci-dessous .Réponses:
La version 4.8 (ou ultérieure) de Moq offre une prise en charge améliorée des paramètres by-ref:
Le même modèle fonctionne pour les
out
paramètres.It.Ref<T>.IsAny
fonctionne également pour lesin
paramètres C # 7 (car ils sont également by-ref).la source
out
, n'est-ce pas?Pour 'out', ce qui suit semble fonctionner pour moi.
J'imagine que Moq regarde la valeur de 'expectValue' lorsque vous appelez le programme d'installation et s'en souvient.
Car
ref
, je cherche aussi une réponse.J'ai trouvé le guide de démarrage rapide suivant utile: https://github.com/Moq/moq4/wiki/Quickstart
la source
Setup
EDIT : Dans Moq 4.10, vous pouvez maintenant passer un délégué qui a un paramètre out ou ref directement à la fonction de rappel:
Vous devrez définir un délégué et l'instancier:
Pour la version Moq avant 4.10:
Avner Kashtan fournit une méthode d'extension dans son blog qui permet de définir le paramètre de sortie à partir d'un rappel: Moq, Callbacks et Out paramètres: un cas de bord particulièrement délicat
La solution est à la fois élégante et hacky. Élégant en ce qu'il fournit une syntaxe fluide qui se sent chez soi avec d'autres rappels Moq. Et hacky car il repose sur l'appel à certaines API Moq internes via la réflexion.
La méthode d'extension fournie sur le lien ci-dessus n'a pas été compilée pour moi, j'ai donc fourni une version modifiée ci-dessous. Vous devrez créer une signature pour chaque nombre de paramètres d'entrée dont vous disposez; J'ai fourni 0 et 1, mais le prolonger devrait être simple:
Avec la méthode d'extension ci-dessus, vous pouvez tester une interface sans paramètres tels que:
.. avec la configuration Moq suivante:
Edit : Pour prendre en charge les méthodes de retour vide, vous devez simplement ajouter de nouvelles méthodes de surcharge:
Cela permet de tester des interfaces telles que:
la source
var methodCall = mock.GetType().GetProperty("Setup").GetValue(mock); mock.GetType().Assembly.GetType("Moq.MethodCall") .InvokeMember("SetCallbackResponse", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, methodCall, new[] { action });
mock.Setup(x=>x.Method(out d)).Callback(myDelegate).Returns(...);
Vous devrez définir un délégué et l'instancier:...Callback(new MyDelegate((out decimal v)=>v=12m))...;
Voici la documentation du site Moq :
la source
Il semble que ce ne soit pas possible hors de la boîte. On dirait que quelqu'un a tenté une solution
Voir ce post sur le forum http://code.google.com/p/moq/issues/detail?id=176
cette question Vérifier la valeur du paramètre de référence avec Moq
la source
Pour renvoyer une valeur avec la définition du paramètre ref, voici un morceau de code:
Déclarez ensuite votre propre délégué correspondant à la signature de la méthode à simuler et fournissez votre propre implémentation de méthode.
la source
En s'appuyant sur Billy Jakes, j'ai fait une méthode de simulation entièrement dynamique avec un paramètre out. Je poste ceci ici pour quiconque le trouve utile (probablement juste pour moi).
la source
Je suis sûr que la solution de Scott a fonctionné à un moment donné,
Mais c'est un bon argument pour ne pas utiliser la réflexion pour jeter un œil aux API privées. C'est cassé maintenant.
J'ai pu définir des paramètres à l'aide d'un délégué
la source
Cela peut être une solution.
la source
J'ai eu du mal avec de nombreuses suggestions ici avant de créer simplement une instance d'une nouvelle classe «Fake» qui implémente l'interface que vous essayez de Mock out. Ensuite, vous pouvez simplement définir la valeur du paramètre out avec la méthode elle-même.
la source
J'ai lutté avec cela pendant une heure cet après-midi et je n'ai trouvé aucune réponse nulle part. Après avoir joué seul avec, j'ai pu trouver une solution qui fonctionnait pour moi.
La clé ici est de
mock.SetupAllProperties();
déterminer toutes les propriétés pour vous. Cela peut ne pas fonctionner dans tous les scénarios de cas de test, mais si tout ce que vous soucier de l'obtenir estreturn value
d'YourMethod
alors cela fonctionnera bien.la source