NUnit没有拿起数据库连接字符串

时间:2018-03-23 11:50:15

标签: c# unit-testing web-config nunit

我有一个项目( SLR )和一个Nunit测试项目( SLR.Tests

与数据库交互的方法的每个测试都失败并带有

  

"对象未设置为对象的实例"

行上的例外

using (SqlConnection con = 
new SqlConnection(ConfigurationManager.ConnectionStrings["isvConnectionString"].ToString()))

将连接字符串硬编码到新语句中按预期工作,并且 在运行SLR项目的过程中调用该方法不会引发任何异常。

因此,NUnit似乎没有拿起配置文件

我已检查过SLR的Bin文件夹。 Tests文件夹包含 SLR.DLL SLR.DLL.Config ,并且配置文件与SLR项目中的web.config文件相同。

Test项目同时安装了NUnit(V3.10.1)和NUit3TestAdapter(V3.10.0)。

关于这里发生了什么的任何想法?

2 个答案:

答案 0 :(得分:2)

测试项目需要app.cofig,其中存在与正在测试的项目中类似的设置。

测试项目在一个单独的应用程序域中运行,因此他们需要自己的配置文件。

ConfigurationManager读取当前正在运行的app域的配置文件,因此从正在测试的项目中复制所需的配置设置,以允许按预期执行测试。

此问题还公开了您的代码如何与直接使用ConfigurationManager的实现问题紧密结合,您应该考虑抽象配置访问,以便可以模拟/替换它们以允许单元测试在隔离。

public interface IConfiguration {
    string AppSetting[string key] { get; }
    string ConnectionStrings[string name] { get; } 
}

答案 1 :(得分:0)

在我的例子中,这是一个 .NET Core 3.1 单元测试项目(使用 NUnit),将 app.config 重命名为 testhost.dll.config 解决了问题,然后 ConfigurationManager 可以拿起配置设置。

这是因为单元测试在 testhost.exe 进程下运行(在调试时查看 VS 输出窗口),它反过来与 testhost.dll(出现在我的测试项目的 \bin\Debug\netcoreapp3.1文件夹)。