我找了很多,仍然找不到一个可靠的解决方案。假设你的应用程序中有一些方法。这些方法使用"System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration“来访问web.config中的某些设置。如果您尝试测试这些方法,您的测试将失败,因为您的测试项目没有web.config。
解决这个问题的最好方法是什么?对于具有简单配置文件的项目,我通常使用这样的方法作为外观方法。
public class Config
{
public static String getKeyValue(String keyName)
{
if (keyName == String.Empty) return String.Empty;
String result = "";
System.Configuration.Configuration rootWebConfig1 =
System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(null);
if (rootWebConfig1.AppSettings.Settings.Count > 0)
{
System.Configuration.KeyValueConfigurationElement reportEngineKey =
rootWebConfig1.AppSettings.Settings[keyName];
if (reportEngineKey != null)
{
result = reportEngineKey.Value;
}
}
return result;
}
}每次我尝试设置OpenWebConfiguration( )的路径时,都会收到错误消息“不允许相对虚拟路径”。
发布于 2012-05-15 01:15:16
为了使该场景更具可测试性,我通常采用自己的“设置管理器”方法,并为其提供一个接口。举个例子:
public interface IConfig
{
string GetSettingValue(string settingName);
}然后我就可以实现我的“真正”实现了:
public sealed class Config : IConfig
{
public string GetSettingValue(string settingName)
{
// your code from your getKeyValue() method would go here
}
}然后我使用它的代码将接受这个的一个实例(这是Dependency Inversion Principal的一个例子):
public void DoStuff(IConfig configuration)
{
string someSetting = configuration.GetSettingValue("ThatThingINeed");
// use setting...
}现在,对于我的产品代码,我可以调用DoStuff并传入Config的一个实例。当我需要测试时,我可以使用模拟工具(Moq,JustMock,RhinoMocks等)来创建一个假的IConfig,它返回一个已知值而不会命中实际的.config文件,或者你也可以通过制作自己的模拟(并将它们存储在你的测试项目中)来在没有模拟框架的情况下完成这项工作。
public class ConfigMock : IConfig
{
private Dictionary<string, string> settings;
public void SetSettingValue(string settingName, string value)
{
settings[settingName] = value;
}
public string GetSettingValue(string settingName)
{
return settings[settingName];
}
}和
[Test]
public void SomeExampleTest()
{
var config = new ConfigMock();
config.SetSettingValue("MySetting", "SomeValue");
var underTest = new MyClass();
underTest.DoStuff(config);
}发布于 2012-05-15 00:59:35
要做到这一点,最简单的方法是使用模拟库,比如moq。这需要一些时间来弄清楚,但是一旦你弄清楚了,你就可以抽象出你的大部分管道来返回你需要的值,以便进行可重复的、一致的测试。
https://stackoverflow.com/questions/10587516
复制相似问题