2016-07-03 1 views
7

J'ai créé une application Web de base asp.net et une application de test unitaire.Utilisation et injection depuis appsettings.json dans des tests unitaires sur .net core

J'ai créé l'application asp.net en utilisant le modèle "Application Web de base ASP.NET (.NET Core)" et créé le projet de test unitaire en utilisant le modèle "Class Library (.NET Core)".

configuré à MSTest en suivant les instructions sur l'article suivant:

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

J'ai organisé l'application dans les contrôleurs et les services, les contrôleurs lisent les valeurs de appsettings.json et passer ceux-ci dans les méthodes de service comme arguments.

I ont une classe AppSettings comme suit

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; 
    } 
} 

Le constructeur de l'automate est la suivante

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

Dans Startup.cs je la ligne suivante dans le procédé ConfigureServices

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

J'ai appris cette technique à partir de l'article suivant

Strongly Typed Configuration Settings in ASP.NET Core

Cela fonctionne au moment de l'exécution, mais je suis en difficulté accéder à ces paramètres dans mes tests unitaires.

J'essaie de trouver un moyen d'obtenir les valeurs de appsettings.json dans mon projet de test, afin que je puisse les transmettre aux contrôleurs et aux services.

Mes méthodes d'essai ressemblent à ceci

[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); 
} 

Comment pourrais-je aller à passer une instance d'une classe qui implémente IOptions<MySettings> au constructeur du contrôleur pour les tests de contrôleur, et comment pourrais-je faire pour obtenir ces valeurs passer aux méthodes de service dans les tests de service.

Répondre

7

Juste le paquet la référence des options et utiliser

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

Voir here pour référence le code source.