从app.config文件中获取web.config部分的值?

4
我正在尝试对最终会出现在web.config文件中的值进行单元测试。在我的测试项目中,我创建了一个包含web.config部分的app.config文件来保存设置。在正常情况下,我会调用System.Configuration.ConfigurationSettings.AppSettings,但在这种情况下,这不起作用。我看到了这个很相似但没有解决如何从配置文件中获取NameValueCollection的问题。以下是配置文件的示例:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.web>
      <membership defaultProvider="CustomMembershipProvider">
        <providers>
          <clear/>
          <add
            name="CustomMembershipProvider"
            applicationName="SettlementInfo"
            enablePasswordRetrieval="false"
            enablePasswordReset="false"
            requiresQuestionAndAnswer="true"
            writeExceptionsToEventLog="true" />
        </providers>
      </membership>
    </system.web>    

</configuration>

有人之前处理过这个问题吗?


有关更多信息,请访问https://dev59.com/4knSa4cB1Zd3GeqPPZhS#52252862。 - Alper Ebicoglu
5个回答

3
我有点糊涂了,看起来你是想测试ASP.NET是否正确使用了你的自定义成员资格提供程序。是吗?
如果是这样,我99.999%确定你不能使用MS框架进行单元测试;你必须通过将其部署到Web服务器(或在VS中运行Cassini)并在登录页面中输入用户名/密码来进行集成测试。
现在,我可能误解了你的要求。如果是这样,请告诉我,我会相应地编辑我的答案。
编辑:
现在,我只是想测试从配置文件中输出的NameValue对,以确保如果值不存在,则应用默认值。换句话说,我想尝试获取applicationName,并验证它是否等于“SettlementInfo”,等等。之后,我将使用集成测试来确保ASP.NET使用自定义框架而不是默认框架。这有意义吗?
我需要更多的回复,所以我正在编辑。如果我理解正确,您想单元测试您的程序以确保它正确处理配置,是吗?也就是说,您想确保您的代码获取了正确的AppSettings键并处理其中的空值,是吗?
如果是这样,那么你很幸运;你根本不需要app.config或web.config,你可以将所需的值设置为测试设置的一部分。
例如:
[TestMethod]
public void Test_Configuration_Used_Correctly()
{
    ConfigurationManager.AppSettings["MyConfigName"] = "MyConfigValue";
    MyClass testObject = new MyClass();
    testObject.ConfigurationHandler();
    Assert.AreEqual(testObject.ConfigurationItemOrDefault, "MyConfigValue");
}

[TestMethod]
public void Test_Configuration_Defaults_Used_Correctly()
{
    // you don't need to set AppSettings for a non-existent value...
    // ConfigurationManager.AppSettings["MyConfigName"] = "MyConfigValue";

    MyClass testObject = new MyClass();
    testObject.ConfigurationHandler();
    Assert.AreEqual(testObject.ConfigurationItemOrDefault, "MyConfigDefaultValue");
}

目前,我只是想测试从配置文件中提取的 NameValue 对,以确保如果这些值不存在时,我的默认值会被应用。换句话说,我想尝试获取 applicationName,并验证它是否等于“SettlementInfo”,以此类推。 - Mark Struzinski
之后,我将使用集成测试来确保ASP.NET正在使用自定义框架而不是默认框架。这样说清楚了吗? - Mark Struzinski
看到我的编辑回答。我可能还是不明白你的意图,但如果我猜得对的话,这应该会让你朝着正确的方向前进。 - Randolpho
这就做到了。我只需要用不同的方式思考问题。感谢您的帮助! - Mark Struzinski

2
我相信只有在应用程序启动时才能访问webconfig文件。解决方法非常简单 ->“伪造”您的配置。使用NameValueCollection并使用它来代替:

private static NameValueCollection CreateConfig()
{
NameValueCollection config = new NameValueCollection();
    config.Add("applicationName", "TestApp");
    config.Add("enablePasswordReset", "false");
    config.Add("enablePasswordRetrieval", "true");
    config.Add("maxInvalidPasswordAttempts", "5");
    config.Add("minRequiredNonalphanumericCharacters", "2");
    config.Add("minRequiredPasswordLength", "6");
    config.Add("requiresQuestionAndAnswer", "true");
    config.Add("requiresUniqueEmail", "true");
    config.Add("passwordAttemptWindow", "10");

    return config;
}

现在,您可以轻松地将该集合传递到从中解析数据的类中。

1

我已经尝试在system.web和membership部分上使用ConfigurationManager.GetSection()方法,但都返回null。我是做错了什么吗? - Mark Struzinski

1
实际上,如果你正在使用 NUnit,你可以将其放在测试项目的 App.config 中。 然后将这行代码添加到你的 Post-build 事件中:
copy /Y "$(ProjectDir)App.config" "$(TargetDir)$(TargetFileName).config"
当你在测试中创建新的提供者时,NUnit 将会在 initialize 方法中将 app.config 中的值传递给提供者。

0

为什么不直接把它放进web.config文件中呢?


我正在进行单元测试的类库中,因此我正在使用app.config。一旦我将其添加到我的Web项目中,它将放在web.config中。 - Mark Struzinski
有没有一种方法可以从类库引用 web.config 文件? - Mark Struzinski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接