因此,我编写了一个 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 项目。
最佳答案
当测试运行程序执行测试时,它通常在以下任一位置运行测试
- 一个新的应用程序域
- 新流程
这在一定程度上取决于测试运行程序,但使用新的 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
。
顺便说一句,如果您正在运行连接到真实云服务的自动化测试,它们不是单元测试,而是 something else 。虽然我不知道您编写测试的动机,但请考虑编写大部分测试,以便它们不依赖于无关的服务。
关于c# - CloudConfigurationManager.GetSetting 在单元测试中返回 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23038148/