2016-07-03 10 views
7

Я создал веб-приложение asp.net core и приложение для тестирования модулей.Использование и впрыскивание из appsettings.json в модульных тестах на ядре .net

Я создал приложение asp.net с использованием шаблона «ASP.NET Core Web Application (.NET Core)» и создал проект модульного тестирования с использованием шаблона «Библиотека классов (.NET Core)».

Я настроил MSTest с помощью инструкции на следующей статье:

Announcing MSTest Framework support for .NET Core RC2/ASP.NET Core RC2

Я организовал применение в контроллерах и услуги, контроллеры считывать значения из appsettings.json и передать их в методы обслуживания, как аргументы.

У меня есть класс AppSettings следующего

public class AppSettings 
{ 
    public string Setting1 { get; set; } 
    public string Setting2 { get; set; } 
    public string Setting3etc { get; set; } 
} 

public static class App 
{ 
    public static AppSettings Settings { get; set; } 

    public static void ConfigureSettings(IOptions<AppSettings> settings) 
    { 
     Settings = settings.Value; 
    } 
} 

Конструктор контроллера заключается в следующем

public ValuesController(IOptions<AppSettings> settings) 
{    
    App.ConfigureSettings(settings); 
} 

В Startup.cs У меня следующая строка в методе ConfigureServices

services.Configure<AppSettings>(Configuration.GetSection("AppSettings")); 

Я узнал об этом методе из следующей статьи

Strongly Typed Configuration Settings in ASP.NET Core

Это работает во время выполнения, но у меня возникают трудности с доступом этих параметров в моих модульных тестах.

Я пытаюсь найти способ получить значения из appsettings.json в свой тестовый проект, чтобы я мог передать их контроллерам и службам.

Мои методы испытаний выглядеть примерно так

[TestMethod] 
[TestCategory("Service - Method1")] 
public void ServiceMethod1Test() 
{ 
    // this compiles but gets null reference exception 
    var setting1 = App.Settings.Setting1; 
    var setting2 = App.Settings.Setting2; 

    var service = new Service(setting1, setting2); 

    var argument1 = "argument"; 
    var actual = service.Method1(argument1); 
    var expected = "expected result"; 

    CollectionAssert.AreEqual(expected, actual); 
} 

[TestMethod] 
[TestCategory("Controller - Method1")] 
public void ControllerMethod1Test() 
{ 
    // how do i create this settings instance? 
    var settings = ??? 

    var controler = new ValuesController(settings); 

    var argument1 = "argument"; 

    var actual = controller.Method1(argument1); 
    var expected = "expected result"; 

    CollectionAssert.AreEqual(expected, actual); 
} 

Как я могу идти о передаче экземпляра класса, который реализует IOptions<MySettings> конструктору контроллера для тестирования контроллера, и как я мог бы идти о получении этих ценностей перейти к методам обслуживания в тесте на обслуживание.

ответ

7

Просто ссылку на пакет опций и использовать

IOptions<MyOptions> options = Options.Create(new MyOptions() 
{ 
    ... 
}); 

См here для справки исходного кода.