2016-10-12 64 views
0

我要測試一個方法,並且除了事實上我無法調用ConfigurationManager.AppSettings,我得到了一切正常。嘲諷ConfigurationManager.Appsettings而不使用Facade方法

我的方法被定義爲

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); 
     ... 

}

我在this question看出,使用門面方法的方法將是很好的,但它會污垢我的類實現不使用DI

我也讀過這個intresting article,但這隻適用於Vs企業版,我希望它可以在CI/VS專業版上運行

我使用NUnit的測試和我的測試是

 [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)); 

     } 

    } 

附:我還使用了resharper的測試工具,排除我運行微軟單元測試框架

+0

那麼你的問題是什麼? – stuartd

+1

如果你不想注入配置,至少你可以做的事情是讓你的應用程序不使用'ConfigurationManager.AppSettings',而是你選擇的單例,這更適合改變。如果你甚至不想這樣做*,那麼可以[重定向在運行時讀取的'.config'文件](http://stackoverflow.com/questions/6150644/),因爲這是(並且因爲您需要生成文件而絕對不適合進行測試)。 –

回答

1

更簡單的方法是開始使用DI的有限實現來刪除ConfigurationManager依賴項。

重載您的構造函數(不管它是什麼)以AppSettings條目作爲參數。

因此,如果您創建的對象,像這樣:

MyObject myObj = new MyObject(SomeParam); 

..with構造函數的聲明......

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

...超載它是這樣的...

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


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

這意味着當您測試時,您使用不調用/要求ConfigurationManager的構造函數構造對象。