2016-04-29 2 views
6

Я хочу использовать IHostingEnvironment и ConfigurationBuilder в своем функциональном тестовом проекте, так что в зависимости от среды функциональные тесты выполняются с использованием другого набора настроек. Я хочу, чтобы использовать код ниже:Использование ConfigurationBuilder для ядра ASP.NET в тестовом проекте

public IConfigurationRoot ConfigureConfiguration(IHostingEnvironment hostingEnvironment) 
{ 
    var builder = new ConfigurationBuilder() 
     .AddJsonFile("appsettings.json") 
     .AddJsonFile($"appsettings.{hostingEnvironment.EnvironmentName}.json", true) 
     .AddEnvironmentVariables(); 
    return builder.Build(); 
} 

Я хочу иметь файл appSettings.json и appSettings.Production.json, чтобы указать свои функциональные тесты при производстве. Это возможно? Как это можно достичь? Мне нужен экземпляр IHostingEnvironment.

ответ

7

Вы можете использовать ConfigurationBuilder в тестовом проекте с несколькими шагами. Я не думаю, что вам понадобится сам интерфейс IHostingEnvironment.

Во-первых, добавьте два пакета NuGet к вашему проекту, которые имеют методы ConfigurationBuilder расширения:

"dependencies": { 
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc1-final", 
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final" 
} 

Во-вторых, положить требуемые переменные среды в свойства тестового проекта:

environment variable dialog

Затем вы можете создать свой собственный строитель в тестовом проекте:

private readonly IConfigurationRoot _configuration; 

public BuildConfig() 
{ 
    var environmentName = Environment.GetEnvironmentVariable("Hosting:Environment"); 

    var config = new ConfigurationBuilder() 
     .AddJsonFile("appsettings.json") 
     .AddJsonFile($"appsettings.{environmentName}.json", true) 
     .AddEnvironmentVariables(); 

    _configuration = config.Build(); 
} 

Если вы хотите использовать точно такой же файл настроек (а не копию), то вам нужно будет добавить путь к нему.

+0

Мой тестовый проект полностью игнорирует любую конфигурацию, которую я устанавливаю; он запускает мой основной проект «Запуск», даже когда я удалил все ссылки на него из моего тестового класса. Я не могу понять это. : / – vaindil

0

Это возможно, согласно документации ASP.NET Core (http://docs.asp.net/en/latest/fundamentals/configuration.html) вы можете построить это внутри метода Startup и добавить переменную среды appSettings. При указании необязательного флага вы можете использовать appSettings.Production.json для рабочей среды и appSettings.json для разработки, если нет приложения appSettings.Development.json. AppSettings. {} Env.EnvironmentName .json используется только тогда, когда файл присутствует и нейтрализация appsettings.json по умолчанию

public Startup(IHostingEnvironment env) 
{ 
    // Set up configuration providers. 
    var builder = new ConfigurationBuilder() 
     .AddJsonFile("appsettings.json") 
     .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); 

    if (env.IsDevelopment()) 
    { 
     // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709 
     builder.AddUserSecrets(); 
    } 

    builder.AddEnvironmentVariables(); 
    Configuration = builder.Build(); 
} 
+0

Так что мне нужно добавить класс запуска в мой тестовый проект? –

+0

Да, я вижу, что пост Уилла добавляет больше деталей. Но вы можете следовать учебному пособию по созданию веб-приложения с ASP.NET 5 или с нуля. Проверьте http://docs.asp.net/ru/latest/tutorials/your-first-aspnet-application.html и https://docs.asp.net/en/latest/fundamentals/startup.html –

Смежные вопросы