将配置文件自动复制到vs的测试项目中
问题描述:
对一个需要读取web.config获取数据库连接字符串的项目创建单元测试,测试抛出异常:System.NullReferenceException: 未将对象引用设置到对象的实例,一步步debug发现在测试项目中无法读取被测项目的web.config文件。后来把web.config整个复制到测试项目中,却也发现不行。无奈之下,把复制到测试项目的web.config改成app.config,却发现可以从app.config中正确读出配置信息了。
相关约定:
1、如果是WEB应用程序,因为配置文件名必须为web.config,所以如果当前目录下有web.config文件,就读取当前目录下的配置文件,如果当前目录没有则读取根目录下的配置文件。
2、如果是winform/wpf/控制台应用程序,则配置文件就是【程序名.exe.config】
这些都是.NET配置系统约定好的规则,更详细的信息楼主可以使用reflector查看System.Web.Configuration.WebConfigurationManager和System.Configuration.ConfigurationManager两个类的源代码
3、如果是vs生成的单元测试项目,配置文件名必须是app.config。所以如果是在Web应用程序中运行单元测试,需要把web.config对应地修改成app.config。这样单元测试项目才能正确地从配置文件中读出相应的配置。因为单元测试是由测试项目运行的,当运行测试项目时,只是引用了我们的被测项目,所以是寻找测试项目的app.config文件
解决方法:
1.在测试项目中添加app.config文件,将被测项目的app.config文件中的内容复制到测试项目的app.config文件中(不推荐,需要维护两份app.config文件)。如果是web应用程序,还需要将web.config重命名为app.config,才能正确被测试项目读取。
2.在解决方案管理器中,右击测试项目→添加→现有项,选择被测项目的app.config文件,并选择“添加为链接”(如果直接添加则和方法1无区别,等同于复制文件,需要维护两个app.config文件,无法随被测项目中的原文件进行更新)
3、修改测试项目的生成事件,以便能够自动将web.config (或app.config)复制到测试项目的bin(输出)目录下。只需要简单几步即可
①右键点“测试项目”,选择属性
②点击“生成事件”→在“后期生成事件命令行”的文本框中输入
copy "$(SolutionDir)\WebApplication1\web.config" "$(ProjectDir)$(OutDir)$(TargetFileName).config"
其中WebApplication1要替换成你被测试项目的名称。
③按下“Ctrl+s”保存,这样每次运行测试项目的时候,他就会从被测试项目中复制一份配置文件
参考网址:
Can a unit test project load the target application's app.config file?