c# - CloudConfigurationManager.GetSetting 在单元测试中返回 Null

标签 c# unit-testing azure visual-studio-2013

因此,我编写了一个 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 项目。

Solution layout

最佳答案

当测试运行程序执行测试时,它通常在以下任一位置运行测试

  • 一个新的应用程序域
  • 新流程

这在一定程度上取决于测试运行程序,但使用新的 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/

相关文章:

c# - 文本解析器的单元测试

azure - Azure 中的反向代理与 Web 应用

使用 Azure Function 的 Azure 应用程序见解。调试日志未显示

c# - 将 4 个字符的字符串转换为 int32

c# - 有没有办法阻止 EF 插入 SQL Server 计算列?

c# - 尝试在 Umbraco 7 中使用自定义路由生成 sitemap.xml 时出错

c# - 在测试管理器中排序编码的 UI 测试和结果

java - 估计大型代码库中所需的单元测试

azure - 工作区身份验证 : More than one token matches the criteria

c# - 是否可以在 .Net 应用程序中读取 Paradox 7.x .db 文件?