.NET Core 3.1单元测试调用ConfigurationManager读取AppSettings返回null如何解决?
问题根因
首先可以明确,该问题和System.Configuration.ConfigurationManager是静态类没有关系,核心是单元测试场景下的程序集运行规则和配置文件匹配逻辑不符合预期:
ConfigurationManager默认读取的是当前运行程序集对应的同名.config文件,控制台应用运行时输出目录会自动生成[控制台程序集名].exe.config,和你项目中的app.config内容一致,因此可以正常读取。- 单元测试项目默认不会自动将项目内的app.config重命名为
[单元测试程序集名].dll.config复制到输出目录;即使你手动完成了重命名复制,Visual Studio TestTools默认的测试运行器会在独立的临时目录执行测试用例,不会将配置文件同步到该临时执行目录,因此读取结果为null。
直接使用ConfigurationManager读取配置的解决方案
按照以下步骤操作即可实现需求,同时支持校验原有配置文件的正确性:
- 配置app.config文件属性
如果你要单独给测试项目写配置,直接在单元测试项目中添加app.config;如果要校验原控制台项目的配置,右键测试项目→添加→现有项→找到控制台项目的app.config,点击添加按钮旁的下拉箭头选择「添加为链接」,保证两边配置同步。
右键选中项目内的app.config,将属性栏的「复制到输出目录」修改为「如果较新则复制」。 - 添加生成后事件自动重命名配置文件
右键单元测试项目→属性→生成事件→在「后期生成事件命令行」中填入以下命令:
该命令会在编译完成后自动将app.config重命名为和测试程序集匹配的配置文件,放到输出目录。copy "$(ProjectDir)app.config" "$(TargetDir)$(TargetName).dll.config" - 禁用测试运行器临时目录规则
在单元测试项目根目录新建.runsettings文件,内容如下:
之后在VS顶部菜单栏→测试→配置测试运行设置→选择解决方案范围的.runsettings文件,指定你刚刚创建的文件即可。该配置会强制测试运行器直接在输出目录执行用例,不会生成临时目录。<?xml version="1.0" encoding="utf-8"?> <RunSettings> <MSTest> <DeploymentEnabled>False</DeploymentEnabled> </MSTest> </RunSettings>
完成以上操作后,你在单元测试中调用ConfigurationManager.AppSettings["my-key"]就可以正常读到配置值,同时用链接方式引入原控制台项目的app.config时,也可以直接在单元测试中校验原配置文件的正确性。
注意:如果后续你计划升级到.NET 5及以上版本,更推荐迁移到Microsoft.Extensions.Configuration配置体系,对多场景的适配性更强。
内容的提问来源于stack exchange,提问作者Fjalee
相关产品推荐
相关产品推荐

