2010-11-29 70 views
1

我完全惊呆了,为什么我的一个单元测试失败。这是一个简单的测试,看看是否返回了正确的连接字符串。我的App.config看起来是这样的:ConfigurationManager ConnectionString抛出错误并返回空

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.web> 
     <compilation defaultLanguage="c#" debug="true" /> 
    </system.web> 
    <connectionStrings> 
     <add name="DbConnectionString" connectionString="Test_HighOnCoding_Db" /> 
    </connectionStrings> 
</configuration> 

这里是我的简单的单元测试,它总是抛出空例外:

[TestFixture] 
public class when_retrieving_database_name_from_config 
{ 
    [Test] 
    public void should_get_the_correct_database_name() 
    { 
     var dbName = ConfigurationManager.ConnectionStrings["DbConnectionString"].ConnectionString; 

     // dbName is always null 

     Assert.AreEqual("Test_HighOnCoding_Db",dbName); 
    } 
} 

回答

5

我原来的答复不按照以下您的评论适用。

有一件事我会建议检查,然后;您的app.config文件是否被您的程序移动到目录中,并且被重命名为与程序相同,并添加了.config文件?

所以,program.exe具有program.exe.config作为配置文件`

看起来你在这里有一个Web应用程序?;如果是这样,你的配置文件应该是 web.config而不是 app.config。然后,您应该使用 System.Web.Configuration命名空间中的 WebConfigurationManager

+0

我删除了system.web部分。该项目是一个单元测试的类库项目。我添加了一个App.config文件。我正在使用MonoDevelop而不是VS. – azamsharp 2010-11-29 17:07:22

0

如果你的testdll是MyTests.dll,你的app.config中的子projet将成为MyTests.dll.config。不幸的是NUnit的希望 “MyTests.config”(不带 “.DLL”)

来解决这个问题

  • 为 “MyTests”
    • 开放NUnit的图形用户界面
    • 创建NUnit的项目
    • 在bin文件夹中创建一个新的nunit项目“MyTests.nunit”
    • 将MyTests.dll添加到MyTests.nunit
    • 保存nunit项目。
    • 出口NUnit的
  • 添加 “MyTests.nunit” 到您的解决方案
    • 复制 “MyTests.nunit” 的项目源。使舒尔设置是否
    • BuildAction的=无
    • 副本Ouptut迪尔=总是
  • 创造条件,项目设置/建事件CONFIGFILE “MyTests.config” 为 “MyTests.nunit”
    • /PostBildEventCommandLine添加
    • 的.config
复制$(PROJECTDIR)\ $的app.config(TARGETDIR)\ $(的TargetName)

现在你可以打开“MyTests.nunit”运行你的单元测试

1

这是一个简单的修复 - 把app.config放到你的测试项目中。

因为您正在运行测试,应用程序。配置需要在您的测试项目中,而不是在您的实际项目中。

执行测试时,正在运行的应用程序的上下文来自您的测试程序集,因此ConfigurationManager.ConnectionStrings将仅在您的测试项目bin文件夹中查找YourTestAssembly.dll.config(它是从您的应用程序自动生成的。配置在你的测试项目文件夹中)。