因此,我编写了一个Azure辅助角色和一些单元测试来验证它是否按预期工作。问题是CloudConfigurationManager.GetSetting总是返回null。
在运行任何单元测试之前调用以下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项目进行任何类型的引用。
答案 0 :(得分:3)
当测试运行器执行测试时,它通常以
中的任何一个运行测试这取决于测试运行者,但是现在使用新的AppDomain似乎是最常用的方法。
每个新进程或AppDomain都有自己的配置设置,不将成为您的.cscfg文件。通常,按照惯例,大多数测试运行器将从单元测试项目的app.config文件中获取配置设置,因此尝试将配置设置放在ServerAgent.Tests.app.config 中。
那就是说,我建议您重构您的系统测试,这样它就不依赖于配置设置,因为测试期间配置设置很难改变。
想象一下,您希望针对不同的配置值测试系统的行为。如果使用配置文件,则无法轻松完成。
虽然我意识到Azure辅助角色要求使用特定签名的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
。
答案 1 :(得分:-2)
您还需要使用* .cscfg和* .csdef中的值来公开值:
<ConfigurationSettings>
<Setting name="<setting-name>" />
</ConfigurationSettings>