Comment se moquer de ConfigurationManager.AppSettings moq
Je suis coincé à ce point de code que je ne sais pas comment faire pour se moquer:
ConfigurationManager.AppSettings["User"];
J'ai simuler le ConfigurationManager, mais je n'ai pas la moindre idée, je suis en utilisant Moq.
Quelqu'un peut me donner une astuce? Merci!
Vous devez vous connecter pour publier un commentaire.
Je crois que l'on approche standard pour cela est d'utiliser un façade modèle pour envelopper le gestionnaire de configuration et puis vous avez quelque chose à couplage lâche que vous avez plus de contrôle.
De sorte que vous vous enveloppez-le ConfigurationManager. Quelque chose comme:
(Il vous suffit d'extraire une interface à partir de votre classe de configuration et ensuite utiliser cette interface partout dans votre code)
Ensuite il suffit juste de se moquer de l'IConfiguration. Vous pourriez être en mesure de mettre en œuvre la façade elle-même en quelques manières différentes. Ci-dessus, je choisi juste pour envelopper les propriétés individuelles. Vous obtenez aussi le côté avantage d'avoir fortement typé informations pour travailler avec, plutôt que faiblement typé hachage de tableaux.
var configurationMock = new Mock<IConfiguration>();
et pour l'installation:configurationMock.SetupGet(s => s.User).Returns("This is what the user property returns!");
Je suis en utilisant AspnetMvc4. Il y a un moment que j'ai écrit
dans ma méthode d'essai et il a parfaitement fonctionné.
Explication: la méthode de test s'exécute dans un contexte avec des paramètres de l'application prises à partir, généralement un
web.config
oumyapp.config
.ConfigurationsManager
peut atteindre cette application globale de l'objet et de le manipuler.: Si vous avez un lanceur de tests l'exécution des tests en parallèle ce n'est pas une bonne idée.
ConfigurationManager.AppSettings
est unNameValueCollection
qui n'est pas thread-safe, des tests en parallèle de l'utiliser sans la synchronisation n'est pas une bonne idée de toute façon. Sinon, vous pouvez simplement appelerConfigurationManager.AppSettings.Clear()
dans votreTestInitialize
/ ctor et vous êtes dorée.ConfigurationManager.AppSettings
est une variable d'instance, et non pas statique? Selon MSDN statiqueNameValueCollection
s sont thread-safe.ConfigurationManager.AppSettings
est en effet statique et renvoie unNameValueCollections
mais ce que ces docs dire, c'est que (public) les membres statiques de laNameValueCollections
classe elle-même sont thread-safe. Mais cela ne veut pas vraiment dire quoi que ce soit, parce queNameValueCollections
n'a pas de public static membres...ConfigurationManager.RefreshSection("appSettings")
Est peut-être pas ce que vous devez accomplir, mais avez-vous songé à utiliser une application.config dans votre projet de test?
Ainsi, le ConfigurationManager obtiendrez les valeurs que vous mettez dans l'application.config et vous n'avez pas besoin de se moquer de quelque chose.
Cette solution fonctionne nice pour mes besoins, car je n'ai jamais besoin de tester une "variable" fichier de config.
Web.config
englobant le projet. Pendant les essais, le tirant, certaines valeurs de laapp.config
est très valable. L'unité de test a juste besoin de s'assurer que les conditions sur le moment où il tire dire "cluster1" fonctionne; il y a seulement 4 groupes différents dans ce cas.Vous pouvez utiliser des cales pour modifier
AppSettings
à une coutumeNameValueCollection
objet. Voici un exemple de comment vous pouvez atteindre cet objectif:Vous pouvez lire plus au sujet des cales et des faux à, Isoler le Code testé avec Microsoft Faux. Espérons que cette aide.
Avez-vous pensé à buter au lieu de se moquer? Le
AppSettings
propriété est unNameValueCollection
:Les avantages sont une simplification de la mise en œuvre et ne dépend d'aucun Système.Configuration jusqu'à ce que vous en avez vraiment besoin.
IConfiguration
comme Josué Enfield suggère peut-être trop haut niveau, et vous risquez de manquer des bugs qui existent en raison de la mauvaise valeur de configuration de l'analyse. D'autre part, à l'aide deConfigurationManager.AppSettings
directement comme LosManos suggère, c'est trop d'un détail d'implémentation, pour ne pas mentionner qu'il peut avoir des effets secondaires sur d'autres tests et ne peut pas être utilisé en parallèle des essais sans synchronisation manuelle (commeNameValueConnection
n'est pas thread-safe).Qui est une propriété statique, et Moq est conçu pour Moq méthodes d'instance ou de classes qui peuvent être moqué par héritage. En d'autres termes, Moq est ne va pas être d'aucune aide pour vous ici.
De se moquer de la statique, j'utilise un outil appelé Les taupes, qui est gratuit. Il y a d'autres cadre d'isolement des outils, comme Typemock qui peuvent le faire aussi, mais je crois que ces outils payants.
Quand il s'agit de la statique et de tests, une autre option est de créer de l'état statique-vous, si cela peut souvent être un problème (comme, j'imagine qu'il serait dans votre cas).
Et, enfin, si l'isolement des cadres ne sont pas une option et que vous êtes engagé dans cette approche, la façade mentionné par Joshua est une bonne approche, ou de toute approche en général l'endroit où vous facteur de code client de ce loin de la logique d'entreprise que vous utilisez pour tester.
Je pense à vous écrire propre application.config fournisseur est une tâche simple, et est plus utile alors rien d'autre. En particulier, vous devez éviter tous les faux comme des cales etc. parce que dès que vous les utilisez Edit & Continuer ne fonctionne plus.
Les fournisseurs-je utiliser ressembler à ceci:
Par défaut, ils obtenir les valeurs de la
App.config
mais pour les tests unitaires, je peux remplacer toutes les valeurs et de les utiliser dans chaque essai, de façon indépendante.Il n'est pas nécessaire pour toutes les interfaces ou de mettre en œuvre à chaque fois, encore et encore. J'ai un utilitaires dll et l'utiliser ce type d'aide dans de nombreux projets et les tests unitaires.