我是单元测试的新手,我正在试图弄清楚是否应该开始使用更多的"内部"访问修饰符.我知道如果我们使用'internal'并设置汇编变量'InternalsVisibleTo',我们可以测试我们不想从测试项目声明公共的函数.这让我觉得我应该总是使用'内部',因为至少每个项目(应该?)都有它自己的测试项目.你们能告诉我为什么不这样做吗?我什么时候应该使用'私人'?
我有一个C#单元测试项目,在app.config文件中有应用程序设置.我正在测试一个存在于不同项目中的类.那个班级取决于两者,ConfigurationManager.AppSettings和ConfigurationManager.ConnectionStrings.
被测试的类所在的项目没有app.config文件.我原以为,因为该类正在单元测试项目的上下文中实例化,它将使用单元测试项目的app.config文件.实际上,连接字符串似乎就是这种情况.
该类检索连接字符串没有任何问题.但是,当类尝试检索任何应用程序设置时,配置管理器始终返回null.这里发生了什么?
编辑1
我想也许在测试项目中尝试加载一些设置以查看会发生什么是个好主意.我试着在调用在外部项目中实例化类的代码之前立即加载单元测试中的设置.同样的结果,没有.我想我暂时可以从等式中排除其他项目.
这是我的配置文件的摘录:
<configSections>
<sectionGroup name="applicationSettings"
type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="MyNamespace.Properties.Settings"
type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
requirePermission="false" />
</sectionGroup>
</configSections>
...
<applicationSettings>
<MyNamespace.Properties.Settings>
<setting name="Bing_Key"
serializeAs="String">
<value>...</value>
</setting>
</MyNamespace.Properties.Settings>
</applicationSettings>
Run Code Online (Sandbox Code Playgroud)
以下是我尝试加载设置的方法:
string test = System.Configuration.ConfigurationManager.AppSettings["Bing_Key"];
Run Code Online (Sandbox Code Playgroud) c# unit-testing app-config application-settings visual-studio
在我的c#表单应用程序(在VS2010中使用.NET 4.0创建)中,我使用应用程序设置来存储输出路径.
以前,此设置配置了用户范围,但我必须将其范围更改为应用程序.
执行此操作后,我现在在启动表单时收到无法识别的配置部分userSettings错误(请注意,在将设置的范围设置为user之前,程序已执行):
InnerException: System.Configuration.ConfigurationErrorsException
Message=Unrecognized configuration section userSettings. (C:\Documents and Settings\Administrator\Local Settings\Application Data\CallCenterForm\CallCenterForm.vshost.exe_StrongName_bplf30wziudnpq0knzaacfuyomd5rv45\1.0.0.0\user.config line 3)
Source=System.Configuration
BareMessage=Unrecognized configuration section userSettings.
Filename=C:\Documents and Settings\Administrator\Local Settings\Application Data\CallCenterForm\CallCenterForm.vshost.exe_StrongName_bplf30wziudnpq0knzaacfuyomd5rv45\1.0.0.0\user.config
Run Code Online (Sandbox Code Playgroud)
所以在做了一些浏览后,这似乎是由系统上仍然存在的旧user.config文件引起的,导致程序读取它并抛出错误(我不确定实际的底层问题是什么).我还可以确认,当我删除文件时,问题就消失了.
这让我想到了我的问题,是否有一种方法可以更改程序,以便它不会读取旧的user.config文件,因为手动删除它并不理想,因为该程序已在多个系统上生产.
抱歉,如果这已经被覆盖,但我找不到答案.
如果这对我的App.config文件的内容有帮助:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="CallCenterForm.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
<applicationSettings>
<CallCenterForm.Properties.Settings>
<setting name="saved_output_dir" serializeAs="String">
<value>c:\</value>
</setting>
</CallCenterForm.Properties.Settings>
</applicationSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)