2014-04-13 88 views
1

所以我寫了一個Azure輔助角色和一些單元測試來驗證它是否按預期工作。問題是CloudConfigurationManager.GetSetting總是返回null。CloudConfigurationManager.GetSetting在單元測試中返回空

運行任何單元測試之前,以下WorkerRole方法被稱爲:

public override bool OnStart() 
{ 
    string connectionString = CloudConfigurationManager.GetSetting("StorageConnectionString"); 

    var account = CloudStorageAccount.Parse(connectionString); 
    ... 
} 

我使用Visual Studio的設置GUI實際設置連接字符串屬性(不同的人對本地和雲部署),所以我知道cscfg文件應該是有效的。 這裏的本地ServerAgent的設置是什麼樣子:

<Role name="ServerAgent"> 
<Instances count="1" /> 
<ConfigurationSettings> 
    <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="UseDevelopmentStorage=true" /> 
    <Setting name="StorageConnectionString" value="SUPER SEKRET" /> 
</ConfigurationSettings> 

所以我想的問題是,如何CloudConfigurationManager找到正確的cscfg文件?單元測試項目引用了ServerAgent項目,但ServerAgent項目沒有對CloudService項目進行任何類型的引用。

Solution layout

回答

3

當測試運行執行測試,它通常運行在任何的

  • 一個新的AppDomain測試
  • 一個新的進程

這取決於一點上測試運行者,但使用新的AppDomain似乎是最近常用的方法。

每個新進程或AppDomain都有自己的配置設置,它們是而不是將成爲您的.cscfg文件。通常,按照慣例,大多數測試運行者將從單元測試項目的app.config文件中獲取配置設置,因此嘗試將配置設置放入ServerAgent.Tests.app.config中。

這就是說,我建議您重構您的被測系統,以便它不依賴於配置設置,因爲配置設置在測試過程中很難改變。

想象一下,您想測試系統針對不同配置值的行爲。如果你使用配置文件,你不能輕易做到這一點。

雖然我認識到,一個藍色的輔助角色需要有一個OnStart方法與特定的簽名,實現它作爲一個Humble Method

public override bool OnStart() 
{ 
    string connectionString = 
     CloudConfigurationManager.GetSetting("StorageConnectionString"); 

    return OnStartImpl(connectionString); 
} 

public bool OnStartImpl(string connectionString) 
{ 
    // Put all implementation code here 
} 

然後測試OnStartImpl代替。

順便說一句,如果你正在運行連接到真正的雲服務的自動化測試,他們不是單元測試,但something else。雖然我不知道你寫測試的動機,但考慮編寫大部分測試,以便它們不依賴於無關的服務。

+0

感謝馬克,我挖出了源代碼,Azure的.NET SDK,你是正確的 - 它最終讀數的配置設置單元測試項目。 至於單元測試v其他 - 你也是對的,但我想確認我沒有犯Azure錯誤。我已經重構了我的代碼,以便Azure相關的所有內容現在都位於可嘲弄的界面之後。 – mamidon

相關問題