首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在.Net C#中引用Web.Config的测试方法

在.Net C#中引用Web.Config的测试方法
EN

Stack Overflow用户
提问于 2012-05-15 00:39:19
回答 2查看 1.3K关注 0票数 3

我找了很多,仍然找不到一个可靠的解决方案。假设你的应用程序中有一些方法。这些方法使用"System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration“来访问web.config中的某些设置。如果您尝试测试这些方法,您的测试将失败,因为您的测试项目没有web.config。

解决这个问题的最好方法是什么?对于具有简单配置文件的项目,我通常使用这样的方法作为外观方法。

代码语言:javascript
复制
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( )的路径时,都会收到错误消息“不允许相对虚拟路径”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-15 01:15:16

为了使该场景更具可测试性,我通常采用自己的“设置管理器”方法,并为其提供一个接口。举个例子:

代码语言:javascript
复制
public interface IConfig
{
    string GetSettingValue(string settingName);
}

然后我就可以实现我的“真正”实现了:

代码语言:javascript
复制
public sealed class Config : IConfig
{
    public string GetSettingValue(string settingName)
    {
        // your code from your getKeyValue() method would go here
    }
}

然后我使用它的代码将接受这个的一个实例(这是Dependency Inversion Principal的一个例子):

代码语言:javascript
复制
public void DoStuff(IConfig configuration)
{
    string someSetting = configuration.GetSettingValue("ThatThingINeed");
    // use setting...
}

现在,对于我的产品代码,我可以调用DoStuff并传入Config的一个实例。当我需要测试时,我可以使用模拟工具(Moq,JustMock,RhinoMocks等)来创建一个假的IConfig,它返回一个已知值而不会命中实际的.config文件,或者你也可以通过制作自己的模拟(并将它们存储在你的测试项目中)来在没有模拟框架的情况下完成这项工作。

代码语言:javascript
复制
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];
    }
}

代码语言:javascript
复制
[Test]
public void SomeExampleTest()
{
    var config = new ConfigMock();
    config.SetSettingValue("MySetting", "SomeValue");

    var underTest = new MyClass();
    underTest.DoStuff(config);
}
票数 2
EN

Stack Overflow用户

发布于 2012-05-15 00:59:35

要做到这一点,最简单的方法是使用模拟库,比如moq。这需要一些时间来弄清楚,但是一旦你弄清楚了,你就可以抽象出你的大部分管道来返回你需要的值,以便进行可重复的、一致的测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10587516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档