NUnit 没有获取数据库连接字符串

NUnit not picking up the database connection string

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

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

"object not set to an instance of an object"

线上异常

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

将连接字符串硬编码到新语句中按预期工作,并且 运行 单反项目中调用该方法不会抛出任何异常。

因此 NUnit 似乎没有获取配置文件

我查看了单反的Bin文件夹。测试文件夹包含 SLR.DLLSLR.DLL.Config 并且配置文件与 web.config 单反项目中的文件。

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

对这里发生的事情有什么想法吗?

测试项目需要 app.cofig 具有与正在测试的项目类似的设置。

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

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

这个问题还暴露了您的代码在直接使用 ConfigurationManager 方面如何与实现问题紧密耦合,您应该考虑抽象配置访问,以便它们可以 mocked/replaced 允许单元测试隔离完成。

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

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

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