我有一个项目( 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)。
关于这里发生了什么的任何想法?
答案 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
文件夹)。