我正在尝试从配置文件中获取数据(URL)
即:
<AppSettings>
<add key="configurationUrl" value="http://xx.xx.xx.xx:XXXX/configuration service/configurations"/>
使用以下代码
reqClient.BaseAddress = System.Configuration.ConfigurationManager.AppSettings["configurationUrl"].ToString();
当我尝试调试它时,它的工作正常,但是当我调试一个调用上面相同代码的单元测试用例时,主要问题出现了,而不是显示&#34; configurationUrl&#34;在APPSettings的AllKeys中,它显示了&#34; TestProjectRetargetTo35Allowed&#34;。我还在测试用例项目中添加了web.config文件。
感谢您的任何帮助。
答案 0 :(得分:10)
我建议你创建一些抽象层来摆脱对ConfigurationManager的依赖。例如:
public interface IConfigurationReader
{
string GetAppSetting(string key);
}
public class ConfigurationReader : IConfigurationReader
{
public string GetAppSetting(string key)
{
return ConfigurationManager.AppSettings[key].ToString();
}
}
然后你可以在单元测试中模拟这个界面。
答案 1 :(得分:3)
问题是您尚未为测试项目创建app.config
文件。您已经创建了web.config
文件,但由于测试项目不是网络项目,因此完全被忽略了。
话虽如此,@Jon_Lindeheim is absolutely right关于在ConfigurationManager
之上引入抽象层。 (ConfigurationManager
是外部依赖项,这意味着您的单元测试不仅仅是测试SUT。)
答案 2 :(得分:3)
一个简单的解决方法是简单地从.web项目复制web.config并粘贴到您的测试项目中,将其重命名为测试项目中的app.config。
这是非常糟糕的,因为单元测试不应该依赖外部依赖,而是一个修复:
@Jon_Lindeheim有最干净的方法,但是通过抽象到接口,以便你可以在测试中存根返回值!