2017-03-11 56 views
0

我周围搜索,没有答案为我工作。我有2个ASP.NET项目,其中一个是我的项目,另一个是包含单元测试的项目。C#在单元测试中注入ConfigurationManager

# 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.configsecretConnectionStrings.config在我Project.Tests解决方案的链接的一个实例。这没有奏效,我不想接口到我的web.config(我想要的值,因为它们保存在Project.Core)。有没有一种解决方案,我可以从Project.Core的web.config中将值抽取到我的单元测试中?

+0

你的单元测试是在单独的项目。您必须在该项目中添加连接字符串。 – kat1330

+0

有没有办法诉诸于此?我不想通过为2个项目维护两组配置文件来引入另一个可能失败的问题 – Zac

+0

您是否考虑过为ConfigurationManager创建一个包装类,在真实代码中使用包装,然后在单元测试中伪造包装? – lilactiger89

回答

1

包含单元测试的项目将需要ConfigurationManager自己的配置文件来提取连接字符串。设置此将只保留1个在配置文件的副本,最好的办法是到同一个文件添加到每个需要的项目,但将其添加为链接文件:

Add Linked File

唐“别忘了设置文件属性,使其与可执行代码部署: Build Action

,将其作为部署项目添加到您的测试夹具(S):

[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之外,请务必为导入的配置文件设置“复制到输出目录”,并将它们作为部署项添加到具有该属性的测试夹具中。

+0

有没有办法将这个配置文件的内容放在'app.config'中?测试项目有它的配置文件,如果链接的文件被命名为'web.config',那么这些更改是否会正确地取回? – Zac

+0

我跟着你的例子,并得到相同的错误。我相信这是因为单元测试正在寻找'app.config',我不能使用配置文件的不同名称。 – Zac

+0

答案已经更新,以解决不同的命名配置文件。 –