我现在已经旋转了一段时间试图弄清楚如何对下面的代码进行单元测试。起初我打算使用Moq模拟一切,但它不包括模拟密封类的能力。我知道我需要使用接口抽象出对实现(配置)的调用吗?但我似乎无法使一切正常。
代码可以改变,但我宁愿保持方法静态,除非你能提出令人信服的理由。您可以添加界面或创建所需的任何接缝。此外,可以重构GetConnStringByName()以返回相关的字符串而不是ConnectionStringSettings。
思想?
namespace Stackoverflow.Rocks
{
/// <summary>
/// Utility class for progmattically selecting values from the Web.config file.
/// </summary>
public class WebConfigStrings
{
//private static Configuration myConfiguration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
/// <summary>
/// Retrieves the desired connection string value based upon the target name.
/// </summary>
/// <param name="connectionStringName">The target connection string referenced in the Web.Config</param>
/// <returns>The value specified in the Web.Config by your connectionStringName</returns>
public static ConnectionStringSettings GetConnStringByName(string connectionStringName)
{
Configuration rootWebConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
ConnectionStringSettings connString;
connString = rootWebConfig.ConnectionStrings.ConnectionStrings[connectionStringName];
return connString;
}
/// <summary>
/// Retrieves the desired application string value based upon the target name.
/// </summary>
/// <param name="applicationStringName">The target application string referenced in the Web.Config</param>
/// <returns>The value specified in the Web.Config by your applicationStringName</returns>
public static string GetAppStringByName(string applicationStringName)
{
string appString = "";
appString = ConfigurationManager.AppSettings[applicationStringName];
return appString;
}
}
}
答案 0 :(得分:2)
重构您的类以使用System.Web.Abstractions中定义的新类型。这个程序集定义了可模拟的类型,它们包含了asp.net构建的核心(主要是静态或密封)类型。这将允许您在测试中使用模拟切换出真实的运行时类型。
答案 1 :(得分:0)
在您的测试项目中,使用虚拟值将您需要的部分添加到配置文件中,并验证这些是您获得的实际值。
答案 2 :(得分:0)
最简单的方法是将伪值添加到配置文件中。由于你的方法是静态的,你不能用Moq / RhinoMocks来模拟这个类。您必须使用具有此功能的TypeMock或Telerik JustMock(但也需要花钱)。
如果要模拟类,则必须使该类成为实例,或者考虑允许将包装类设置为处理配置内容的静态属性。这样,你可以使用一个接口进行测试,提供一个使用配置文件的真实类,然后通过将假设置为静态属性,在测试过程中将其交换出来。
HTH。
答案 3 :(得分:0)
如果有人对此感兴趣我正在做什么,我在System.Web和我的使用(ShimsContext.Create())块中使用Fakes程序集我有:
System.Web.Configuration.Fakes.ShimWebConfigurationManager.ConnectionStringsGet = () => new ConnectionStringSettingsCollection(){ new ConnectionStringSettings("name", "fake connection string")};
不确定这是否是您正在寻找的,但认为值得一提。