【问题标题】:CloudConfigurationManager.GetSetting Returns Null in Unit TestsCloudConfigurationManager.GetSetting 在单元测试中返回 Null
【发布时间】:2014-04-13 01:37:28
【问题描述】:

所以我编写了一个 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 项目的任何形式的引用。

【问题讨论】:

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


    【解决方案1】:

    当一个测试运行器执行测试时,它通常会在任何一个中运行测试

    • 一个新的 AppDomain
    • 新流程

    这在一定程度上取决于测试运行程序,但使用新的 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。虽然我不知道您编写测试的动机,但请考虑编写大部分测试,以免它们依赖于无关服务。

    【讨论】:

    • 谢谢马克,我挖掘了 Azure .NET sdk 的源代码,你说得对——它最终是读取单元测试项目的配置设置。至于单元测试 v 其他东西——你也是正确的,但我想验证我在 Azure 上没有犯错。我已经重构了我的代码,现在所有与 Azure 相关的东西都在一个可模拟的接口后面。
    【解决方案2】:

    您还需要在 *.cscfg 和 *.csdef 中具有值才能公开该值:

    <ConfigurationSettings>
          <Setting name="<setting-name>" />
    </ConfigurationSettings>
    

    http://msdn.microsoft.com/en-us/library/gg557553.aspx

    【讨论】:

      猜你喜欢
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-19
      • 2020-06-14
      • 2020-11-02
      • 2014-08-10
      • 1970-01-01
      相关资源
      最近更新 更多