2013-07-10 44 views
13

我想为我的项目编写单元测试,但它不会让我使用配置管理器。现在我的项目的设置类似于不能在单元测试项目中使用ConfigurationManager

ASP.Net应用程序(所有aspx页面)

ProjectCore(所有的C#文件 - 模型)

ProjectTest(所有测试)

在我ProjectCore

,我能够从System.Configuration访问ConfigurationManager对象并将信息传递到项目中。然而,当我跑了一个测试,ConfigurationManager中涉及,我得到的错误

System.NullReferenceException: Object reference not set to an instance of an object. 

下面是测试的一个例子

using System.Configuration; 

[TestMethod] 
public void TestDatabaseExists() 
{ 
    //Error when I declare ConfigurationManager 
    Assert.IsNotNull(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString 
} 
我在其他测试中

,ConfigurationManager.ConnectionStrings [“的ConnectionString” ] .ConnectionString是我将数据适配器的配置字符串设置为,并在测试中返回空错误,但在实际使用网站时不会返回空错误。有任何想法吗?

+0

你正在做单元测试和单元测试你的注意力应该是想测试特定的方法和应该删除多余的依赖。在这种情况下,尝试嘲笑/摩尔(使用MS Mole/Pex)system.configuration类;那肯定会给出一个解决方案。 – Rahul

+0

@JohnSaunders所以在我的测试中,NullReferenceException是当我实际分配字符串到配置管理器。例如... String cs = ConfigurationManager.ConnectionStrings [“ConnectionString”]。ConnectionString – willykao

+0

@JohnSaunders除非如果ConfigurationManager仅在单元测试的情况下为空(因为我在实际的ASP中没有得到这个错误。网络应用程序),想知道我是否真的可以在测试中使用配置管理器 – willykao

回答

21

这可能是几个问题之一:

  1. 您还没有添加的app.config到您的ProjectTest项目。
  2. 您没有在您的app.config中添加连接字符串。

+2

haha​​ha oops,我有一个web.config文件,而不是app.config。原因是我有ASP.net项目中的web.config,并且由于核心不需要它在那里工作的配置文件,我以为我可以使用相同的一个,但多数民众赞成noob,感谢提醒 – willykao

+0

谢谢,也有同样的问题。 –

+0

你是一个传奇人物谢谢你! – Danrex

2

你正在做单元测试和单元测试你的注意力应该是想测试特定的方法和应该删除多余的依赖。在这种情况下,尝试嘲笑/ mole((使用Microsoft Mole和Pex)system.configuration class;那肯定会给出一个解决方案。

我说的是,一旦你在你的测试项目解决方案中安装了MS moles-and-pex->右键单击系统程序集并选择create mole。

这将给你一个配置类的mole'ed版本,反过来将有一个configuration class嘲笑版本 - 使用它,你可以绕过你面临的问题。

0

它与mstest.exe命令行中的/ noisolation参数有关。 省略/ noisolation参数,它工作。

+0

这实在是一个评论,而不是一个答案。一旦你获得了足够的声望,[你将能够发表评论](// stackoverflow.com/privileges/comment)。 –

0

您还可以使用特殊配置的路径与ExeConfigurationFileMap

// Get the machine.config file. 
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); 
// You may want to map to your own exe.config file here. 
fileMap.ExeConfigFilename = @"C:\test\ConfigurationManager.exe.config"; 
// You can add here LocalUserConfigFilename, MachineConfigFilename and RoamingUserConfigFilename, too 
System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); 
相关问题