Получить значения из раздела web.config в файле app.config? - PullRequest
4 голосов
/ 05 марта 2009

Я пытаюсь провести модульное тестирование значений, которые в итоге окажутся в файле web.config. В моем тестовом проекте я создал файл app.config с разделом web.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>

Кто-нибудь имел дело с этим раньше?

Ответы [ 5 ]

3 голосов
/ 05 марта 2009

Полагаю, я здесь запутался; похоже, вы пытаетесь проверить, что ASP.NET правильно использует ваш пользовательский поставщик членства. Правильный?

Если это так, я на 99,999% уверен, что вы не можете выполнить модульное тестирование с помощью MS Framework; Вы должны протестировать интеграцию, развернув ее на веб-сервере (или запустив Cassini в VS) и введя имя пользователя / пароль на своей странице входа.

Теперь, возможно, я неправильно понял ваш запрос. Если так, дайте мне знать, и я отредактирую свой ответ соответственно.

Edit:

Пока я просто пытаюсь проверить выходящие пары 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");
}
2 голосов
/ 30 июня 2010

Я полагаю, что у вас есть доступ к файлу 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 голос
/ 23 января 2012

На самом деле, если вы используете NUnit, вы можете вставить это в файл App.config в своем тестовом проекте. Затем добавьте эту строку в ваше событие после сборки:

copy / Y «$ (ProjectDir) App.config» «$ (TargetDir) $ (TargetFileName) .config»

Когда вы создаете новый поставщик в своих тестах, NUnit передает значения в вашем app.config поставщику в методе initialize.

1 голос
/ 05 марта 2009

Вы должны иметь возможность использовать метод ConfigurationManager.GetSection () , чтобы извлечь все, что вы хотите.

0 голосов
/ 05 марта 2009

Почему бы просто не вставить его в файл web.config?

...