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

时间:2009-03-04 21:01:44

标签: c# .net asp.net web-config app-config

我正在尝试对最终会在web.config文件中出现的测试值进行单元测试。在我的测试项目中,我创建了一个带有web.config部分的app.config文件来保存设置。在正常情况下,我会调用System.Configuration.ConfigurationSettings.AppSettings,但在这种情况下,这不起作用。我看到了this question,它非常相似,但没有说明如何从配置文件中获取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>

以前有人处理过这个吗?

5 个答案:

答案 0 :(得分: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");
}

答案 1 :(得分:2)

我相信您只有在应用程序实际启动时才能访问webconfig文件。解决方案相当简单 - &gt; “假”你的配置。使用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;
}

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

答案 2 :(得分:1)

您应该能够使用ConfigurationManager.GetSection()方法提取您想要的任何内容。

答案 3 :(得分:1)

实际上,如果您使用的是NUnit,可以将其粘贴在测试项目的App.config中。 然后将此行添加到Post-build事件:

copy / Y“$(ProjectDir)App.config”“$(TargetDir)$(TargetFileName).config”

在测试中创建新提供程序时,NUnit会将app.config中的值传递给initialize方法中的提供程序。

答案 4 :(得分:0)

为什么不把它放在web.config文件中?