对一个需要读取app.config获取数据库连接字符串的项目创建单元测试,测试抛出异常:System.NullReferenceException: 未将对象引用设置到对象的实例,一步步debug发现在测试项目中无法读取被测项目的app.config文件。在网上看到解决方法有三种:
1.在测试项目中添加app.config文件,将被测项目的app.config文件中的内容复制到测试项目的app.config文件中(不推荐,需要维护两份app.config文件)
2.在解决方案管理器中,右击测试项目→添加→现有项,选择被测项目的app.config文件,并选择“添加为链接”(如果直接添加则和方法1无区别,等同于复制文件,需要维护两个app.config文件,无法随被测项目中的原文件进行更新)
3.如这里面的最佳答案所述:http://stackoverflow.com/questions/344069/can-a-unit-test-project-load-the-target-applications-app-config-file
我的问题是:
1.方法3,配置测试部署这个,我试过却不成功,可能我的做法不对,能不能有朋友告诉我该怎么做?
2.我曾经写过一个项目,调用其他项目发布到IIS服务器的web service,这个web service读取的就是自己的web.config文件用于远程连接数据库;我觉得用VS2008创建的测试项目本身也是一种调用的方式,调用被测项目,为什么却要读取测试项目自己的app.config文件?我有点搞不懂,在项目中涉及到读取配置文件的代码时,什么时候读取自己的配置文件,什么时候读取所调用项目的配置文件?
如果是WEB应用程序,因为配置文件名必须为web.config,所以如果当前目录下有web.config文件,就读取当前目录下的配置文件,如果当前目录没有则读取根目录下的配置文件。
如果是winform或控制台应用程序,则配置文件就是【程序名.exe.config】
这些都是.NET配置系统约定好的规则,更详细的信息楼主可以使用reflector查看System.Web.Configuration.WebConfigurationManager和System.Configuration.ConfigurationManager两个类的源代码
我试着用reflector查看,想问您两个reflector使用的问题:
怎么找类中extern方法的定义,就是说怎么知道这个extern的定义在哪个程序集里?
您直接调试过.net源码吗?就是网上很多人说的从微软的服务器上下载符号的方法?
@Jessie.M:
在VS里面将鼠标焦点移到方法上面,点击鼠标右键,点击【转到定义】菜单项,VS就会转到扩展方法的元数据定义,将鼠标光票移到当前页面的标签上,就会显示出代码所在的程序集信息
@Eugene Wang:
@Eugene Wang: 就是一直这样转到定义、转到定义,查看到一个方法:
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool InternalEquals(object objA, object objB);
时,怎么也转不到定义了
1. 不知道你遇到的是什么问题,我的想法是在ClassInitialize方法里写代码把config文件拷贝到测试项目运行目录
2. 因为单元测试是由测试项目运行的,而当你运行测试项目时,只是引用了你的被测项目,所以是寻找测试项目的config文件
mark