147 votes

Comment se moquer de ConfigurationManager.AppSettings avec moq

Je suis coincé à ce point de code que je ne sais pas comment se moquer:

 ConfigurationManager.AppSettings["User"];
 

Je dois me moquer du ConfigurationManager, mais je n'ai pas la moindre idée, j'utilise Moq .

Quelqu'un peut me donner un pourboire? Merci!

222voto

LosManos Points 1396

J'utilise AspnetMvc4. Il y a un instant j'ai écrit

 ConfigurationManager.AppSettings["mykey"] = "myvalue";
 

dans ma méthode de test et cela a fonctionné parfaitement.

Explanation: la méthode de test s'exécute dans un contexte avec les paramètres d'application pris, généralement un web.config ou myapp.config . ConfigurationsManager peut atteindre cet objet d'application global et le manipuler.

Bien que: si vous avez un testeur exécutant des tests en parallèle, ce n'est pas une bonne idée.

120voto

Joshua Enfield Points 4288

Je crois que l'on approche standard est d'utiliser une 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.

Donc vous l'envelopper le ConfigurationManager. Quelque chose comme:

public class Configuration: IConfiguration
{
    public User
    {
        get{ 
               return ConfigurationManager.AppSetting["User"];
       }
    }
}

(Vous pouvez tout simplement 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.

22voto

Iridio Points 5978

Peut-être n’est-ce pas ce que vous devez accomplir, mais avez-vous envisagé d’utiliser un app.config dans votre projet de test? Ainsi, le ConfigurationManager obtiendra les valeurs que vous avez entrées dans le fichier app.config et vous n'avez pas besoin de vous moquer de rien. Cette solution convient à mes besoins, car je n'ai jamais besoin de tester un fichier de configuration "variable".

14voto

Zorayr Points 2637

Vous pouvez utiliser des shims pour modifier AppSettings en un objet personnalisé NameValueCollection . Voici un exemple de la façon dont vous pouvez y parvenir:

 [TestMethod]
public void TestSomething()
{
    using(ShimsContext.Create()) {
        const string key = "key";
        const string value = "value";
        ShimConfigurationManager.AppSettingsGet = () =>
        {
            NameValueCollection nameValueCollection = new NameValueCollection();
            nameValueCollection.Add(key, value);
            return nameValueCollection;
        };

        ///
        // Test code here.
        ///

        // Validation code goes here.        
    }
}
 

Pour en savoir plus sur les cales et les contrefaçons, consultez la section Isolation du code à tester avec Microsoft Fakes . J'espère que cela t'aides.

11voto

Daniel Points 181

Avez-vous envisagé d'abattre au lieu de vous moquer? La propriété AppSettings est un NameValueCollection :

 [TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        // Arrange
        var settings = new NameValueCollection {{"User", "Otuyh"}};
        var classUnderTest = new ClassUnderTest(settings);

        // Act
        classUnderTest.MethodUnderTest();

        // Assert something...
    }
}

public class ClassUnderTest
{
    private readonly NameValueCollection _settings;

    public ClassUnderTest(NameValueCollection settings)
    {
        _settings = settings;
    }

    public void MethodUnderTest()
    {
        // get the User from Settings
        string user = _settings["User"];

        // log
        Trace.TraceInformation("User = \"{0}\"", user);

        // do something else...
    }
}
 

Les avantages sont une implémentation plus simple et aucune dépendance de System.Configuration jusqu'à ce que vous en ayez vraiment besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X