2016-10-12 2 views
0

Ich sollte eine Methode testen und ich habe alles funktioniert, außer für die Tatsache, dass ich nicht in der Lage, die ConfigurationManager.AppSettings moq.Mocking ConfigurationManager.Appsettings ohne Verwendung von Facade Approach

Meine Methode als

public async Task<IDictionary<string, object>> Action(IDictionary<string, object> context) 
    { 
     if (ConfigurationManager.AppSettings[ApplicationUserFromDomainUserKey] == null) 
      throw new ConfigurationErrorsException(ApplicationUserFromDomainUserKey); 
     string storedProcedure = ConfigurationManager.AppSettings.Get(ApplicationUserFromDomainUserKey); 

     if (ConfigurationManager.ConnectionStrings[DbConnectionKey] == null) 
      throw new ConfigurationErrorsException(DbConnectionKey); 
     ... 

definiert ist}

ich in this question gesehen habe, dass ein Ansatz, um die Fassade Ansatz wäre schön, aber es wäre Schmutz meiner Klasse Implementierung, die nicht Gebrauch macht

von IoC/DI

ich habe auch diese intresting article lesen, aber dies gilt nur für Vs Enterprise Edition, und ich möchte es auf CI runnable sein/VS Professional Edition

Ich verwende NUnit für die Prüfung und mein Test ist

 [Test] 
    public void MissingAppSettingsKey() 
    { 
      var pipeline = new RetrieveApplicationUsernamePipelineStep(); 

      var context = new Dictionary<string, object>() 
      { 
       [Resources.DomainUser] = "andrea", 
       [Resources.Domain] = "ifinformatica.net", 
       [Resources.ApplicationId] = 0 
      }; 

      Assert.ThrowsAsync<ConfigurationErrorsException>(async() => await pipeline.Action(context)); 

     } 

    } 

P. S. Ich benutze auch Resharper-Tools zum Testen, die mich ausschließt, das Microsoft-Unit-Testframework auch

+0

Also, was ist deine Frage? – stuartd

+1

Das Mindeste, was Sie tun könnten, wenn Sie die Konfiguration nicht injizieren möchten, ist, dass Ihre Anwendung nicht 'ConfigurationManager.AppSettings' verwendet, sondern ein Singleton Ihrer Wahl, das besser geändert werden kann. Wenn Sie * das * nicht einmal machen wollen, ist es möglich, die '.config' Datei, die zur Laufzeit gelesen wird, erneut zu adressieren (http://stackoverflow.com/questions/6150644/), hacky wie dies ist (und dezidiert suboptimal für das Testen, da Sie Dateien generieren müssen). –

Antwort

1

auszuführen. Der einfachere Ansatz wäre, eine begrenzte Implementierung von DI zu verwenden, um die ConfigurationManager-Abhängigkeit zu entfernen.

Überladen Sie Ihren Konstruktor (was auch immer es war), um die AppSettings Einträge als Parameter zu übernehmen.

Also, wenn Sie erstellt Ihr Objekt wie folgt:

MyObject myObj = new MyObject(SomeParam); 

..mit Konstruktor Erklärung ...

public MyObject(ParamObj someParam) 
    { 
    //...implementation.... 
    } 

... Überlastung es wie so ...

public MyObject(ParamObj someParam) 
    : this(someParam, Convert.ToInt32(ConfigurationManager.AppSettings["mySetting"])) 
    { 
    //...implementation.... 
    } 


    public MyObject(ParamObj someParam, int mySettingValue) 
    { 
    //...implementation.... 
    } 

Das bedeutet, wenn Sie testen, konstruieren Sie Objekte, die den Konstruktor verwenden, der ConfigurationManager nicht aufruft/erfordert.

Verwandte Themen