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

时间:2014-04-13 01:37:28

标签: 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

2 个答案:

答案 0 :(得分:3)

当测试运行器执行测试时,它通常以

中的任何一个运行测试
  • 一个新的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。虽然我不知道你编写测试的动机,但考虑编写大部分测试,以便它们不依赖于无关的服务。

答案 1 :(得分:-2)

您还需要使用* .cscfg和* .csdef中的值来公开值:

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

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