Как использовать web.config при модульном тестировании приложения asp.net

Я начинаю с модульного тестирования, у меня есть метод, который использует файл web.config для строки подключения.

Я надеялся, что смогу использовать

[DeploymentItem("web.config")]

чтобы получить файл веб-конфигурации, это все равно оставляет мне исключения с нулевой ссылкой (это будет то, что я пишу для своего следующего теста).

Как использовать файл конфигурации, включенный в проект, который я пытаюсь проверить?

Я использую платформу тестирования, включенную в VS 2008, если это имеет значение.

Спасибо

Ответ 1

Unit test проекты должны иметь собственный конфигурационный файл.

В тестовом проекте вы можете выбрать "Добавить", "Новый элемент", "Файл конфигурации приложения".

Этот файл будет вести себя точно так же, как и файл web.config, но затем для ваших модульных тестов.

Ответ 2

Вы можете загрузить в web.config или app.config из любого места с помощью OpenMappedExeConfiguration.

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap()
fileMap.ExeConfigFilename = @"c:\my-web-app-location\web.config"

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
string connectionString = config.AppSettings.Settings["ConnectionString"].Value;

Вот web.config, довольно стандартный.

<?xml version="1.0"?>
<configuration>
  <configSections>
  </configSections>
  <appSettings>
    <add key="ConnectionString" value="Data Source=XXXX;Initial Catalog=XXX; Trusted_Connection=True;"/>
  </appSettings>
</configuration>

Обновление от 2017-09-29

Я подошел к классу, чтобы упростить чтение AppSetitngs из файла. Я получил идею от Zp Bappi.

public interface IAppSettings
{
    string this[string key] { get; }
}

public class AppSettingsFromFile : IAppSettings
{
    readonly Configuration Config;

    public AppSettingsFromFile(string path)
    {
        var fileMap = new ExeConfigurationFileMap();
        fileMap.ExeConfigFilename = path;
        Config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
    }

    public string this[string key]
    {
        get
        {
            return Config.AppSettings.Settings[key].Value;
        }
    }
}

Вот как использовать класс.

var AppSettings = new AppSettingsFromFile(@"c:\my-web-app-location\web.confg");
string connectionString = AppSettings["ConnectionString"];

Ответ 3

Скопируйте файл web.config в папку "/bin" и переименуйте его в "AppName.dll.config".

Где "AppName" - это имя результирующей сборки.

Я использовал этот хак много раз.

Ответ 4

Вы хотите, чтобы ваши результаты были четко определены и повторяемы. Для этого вам нужно будет работать с известными данными, чтобы вы могли четко определить как ваши обычные случаи, так и ваши граничные случаи. В моей работе это всегда определенный сервер и набор данных, поэтому модуль модульного тестирования имеет встроенную строку подключения. Другие предпочитают использовать строку соединения из проекта Unit Testing. Я никогда не видел, чтобы кто-нибудь рекомендовал использовать конфигурационный файл веб-сайта! (разработка или иное)

Ответ 6

Если вам нужна строка подключения, вы не пишете unit test (предполагая, что используете строку подключения для перехода в базу данных). Модульные тесты не должны взаимодействовать с внешней средой. Вы захотите запустить все из них после каждой проверки, чтобы они лучше работали со скоростью света.

Для unit test вы захотите изолировать свой код от своей базы данных. Измените свои тесты (и код, который вы тестируете, если необходимо), чтобы вам не нужно было переходить в базу данных для их тестирования.