MSTest集成测试无法读取App.Config配置文件连接字符串问题求助
问题原因
- 配置文件复制属性问题:测试项目中App.config文件的「复制到输出目录」属性默认值为「不复制」,编译后配置文件不会被输出到程序运行目录,导致ConfigurationManager无法读取到对应配置。
- .NET 5 + MSTest 兼容问题:.NET 5属于.NET Core技术谱系,和传统.NET Framework的配置加载逻辑不同。MSTest运行.NET 5测试时的宿主程序为
testhost.dll,默认会读取同目录下的testhost.dll.config,而非测试项目生成的「[测试项目名].dll.config」,就算App.config被复制到输出目录,文件名不匹配也会导致读取结果为null。
解决建议
方案1:改用.NET 5原生配置体系(最推荐)
该方案完全适配.NET 5的设计逻辑,不存在遗留兼容问题:
- 给测试项目安装
Microsoft.Extensions.Configuration、Microsoft.Extensions.Configuration.Json两个Nuget包 - 移除原有App.config,新增
appsettings.json配置文件,内容如下:
{ "ConnectionStrings": { "Database": "Data Source=DESKTOP\\SQLEXPRESS;Initial Catalog=Database;Integrated Security=True;" } }
- 右键点击
appsettings.json,将属性栏中的「复制到输出目录」修改为「如果较新则复制」 - 调整测试代码的配置读取逻辑:
[TestClass] public class AdminDatabaseReaderTests { private readonly string _connectionString; public AdminDatabaseReaderTests() { var config = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) .AddJsonFile("appsettings.json") .Build(); _connectionString = config.GetConnectionString("Database"); } [TestMethod] [TestCategory("Database Tests")] public void AdminDatabaseReader_GetAll_WhenCallingDatabase_ShouldReturnListOfAdminTableRows() { // Arrange var adminDatabaseReader = new AdminDatabaseReader(_connectionString); // Act var listOfAdmins = adminDatabaseReader.GetAll(); // Assert } }
方案2:兼容原有ConfigurationManager写法
如果不想修改现有的ConfigurationManager读取逻辑,可以通过生成事件自动匹配配置文件名:
- 右键点击测试项目的App.config文件,将「复制到输出目录」修改为「如果较新则复制」
- 右键测试项目 → 选择「属性」→ 切换到「生成事件」 tab → 在「生成后事件命令行」输入框中填写以下内容:
copy /Y "$(TargetDir)$(TargetName).dll.config" "$(TargetDir)testhost.dll.config"
- 重新编译项目后运行测试,即可正常读取连接字符串。
方案3:临时调试方案(仅用于快速验证功能,不推荐正式使用)
如果只是临时验证测试逻辑,可以直接把连接字符串硬编码在测试代码中,绕开配置读取环节。
内容的提问来源于stack exchange,提问作者James McKinney
相关产品推荐
相关产品推荐

