C#在单元测试中注入ConfigurationManager

时间:2017-03-11 22:34:41

标签: c# asp.net unit-testing

我四处搜寻,没有答案对我有用。我有2个ASP.NET项目,其中一个是我的项目,另一个是包含单元测试的项目。

# Projects
Project.Core
    ...
    secretConnectionStrings.config
    Web.config

Project.Tests

Project.Core中,我有一个请求连接字符串(来自secretConnectionStrings.config)和来自web.config文件的应用程序设置的方法。执行它自己,从两者中提取正确的值这些配置文件。但是,我想在我的单元测试中测试它。

我的测试看起来像这样(Project.Tests内):

[TestClass]
public class TestUserController
{
    [TestMethod]
    public void Post_ShouldReturnNewUser()
    {
        var controller = new UserController();

        var result = controller.Post() as User;
        Assert.AreNotEqual(result, null);
    }
}

它爆炸的线是这个

string cacheConnection = ConfigurationManager.ConnectionStrings["RedisCache"].ConnectionString;

System.NullReferenceException:未将对象引用设置为对象的实例

我尝试在web.config解决方案中添加secretConnectionStrings.configProject.Tests作为链接。这没用,我不想接口到我的web.config(我想要保存在Project.Core中的值)。是否有解决方案可以将Project.Core的web.config中的值拉入我的单元测试中?

1 个答案:

答案 0 :(得分:1)

包含单元测试的项目将需要自己的配置文件,以便ConfigurationManager引入连接字符串。设置此项只保留配置文件的一个副本的最佳方法是将相同的文件添加到需要它的每个项目中,但将其添加为链接文件:

Add Linked File

不要忘记设置文件属性,以便使用可执行代码进行部署: Build Action

将其作为部署项添加到测试夹具中:

[TestClass]
[DeploymentItem(@"db.config")]
public class MyTestFixture { ... }

现在,如果您想在两个不同名称的配置文件(app.config& web.config)中拥有集中连接字符串,那么您可以将它们放在第三个文件db.config中,将该文件导入每个其他配置文件:

<强> db.config

<connectionStrings>
    <add name="testDb" connectionString="data source=(localdb)\v11.0;..."
        providerName="System.Data.SqlClient" />
</connectionStrings>

app.config / web.config

<connectionStrings configSource="db.config" />

除了app.config或web.config之外,还要确保为导入的配置文件设置“复制到输出目录”,并将它们作为部署项添加到具有该属性的测试夹具中。