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>

以前有没有人处理过这个问题?

4

5 回答 5

3

我想我在这里很困惑;看起来您正在尝试测试 ASP.NET 是否适当地使用了您的自定义成员资格提供程序。正确的?

如果是这样,我 99.999% 确定您不能使用 MS 框架对此进行单元测试;您必须通过将其部署到网络服务器(或在 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");
}
于 2009-03-04T21:25:08.790 回答
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;
}

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

于 2010-06-30T14:58:27.427 回答
1

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

于 2009-03-04T21:51:03.753 回答
1

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

复制 /Y “$(ProjectDir)App.config” “$(TargetDir)$(TargetFileName).config”</p>

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

于 2012-01-23T17:41:23.267 回答
0

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

于 2009-03-04T21:05:33.487 回答