1

Ich mache ein Unittest-Projekt, um mein Webapi zu testen, und ich muss einen Controller initialisieren. Das Problem ist, dass es im Konstruktor eine IConfiguration erhält, die durch Abhängigkeitsinjektion bereitgestellt wird und gut funktioniert.Wie bekomme ich eine Instanz von IConfiguration in asp.net core?

Aber wenn ich es manuell initialisieren möchte, habe ich keine Möglichkeit, diese Instanz zu bekommen.

Ich versuche, es aus einem Unittest-Projekt innerhalb des gleichen Projekts zu initialisieren.

Der Controller sieht aus wie:

public Controller(IConfiguration configuration) { _configuration = configuration; } 

Antwort

2

ich wahrscheinlich aus der Erklärung beginnen sollte würde, dass in .NET Core-Anwendung, die Sie nicht Instanz von IConfiguration auf Ihre Controller oder andere Klassen passieren sollten. Sie sollten stark typisierte Einstellungen verwenden, die über IOtions<T> eingegeben werden. Siehe diesen Artikel für weitere Details: Options pattern in ASP.NET Core.

Wenn Sie das Optionsmuster verwenden, haben Sie POCO für die Einstellungen, die von einem Controller benötigt werden. Diese Einstellungen Objekt wird dann in der Steuerung in IOptions<T> gewickelt injiziert:

public class ControllerSettings 
{ 
    public string Setting1 { get; set; } 

    public int Setting2 { get; set; } 

    // ... 
} 

public class Controller 
{ 
    private readonly ControllerSettings _settings; 

    public Controller(IOptions<ControllerSettings> options) 
    { 
     _settings = options.Value; 
    } 
} 

Dann ziemlich einfach es ist keine Einstellungen zu übergeben Sie von einem Unit Test wollen. Füllen Sie einfach Einstellungen Instanz und wickeln zu IOptions<T> mit einem der verfügbaren spöttischen Frameworks, wie Moq oder NSubstitute:

[TestMethod] 
public void SomeTest() 
{ 
    var settings = new ControllerSettings 
    { 
     Setting1 = "Some Value", 
     Setting2 = 123, 
    }; 

    var options = new Mock<IOptions<ControllerSettings>>(); 
    options.Setup(x => x.Value).Returns(settings); 

    var controller = new Controller(options.Object); 

    // ... 
} 

Manchmal reale Konfiguration des Projekts zu verwenden, es ist erforderlich, wenn beispielsweise Integrationstest zu entwickeln. In diesem Fall könnten Sie eine Instanz von ConfigurationBuilder erstellen und diese mit den gleichen Konfigurationsquellen wie im getesteten Code füllen:

IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); 
// Duplicate here any configuration sources you use. 
configurationBuilder.AddJsonFile("AppSettings.json"); 
IConfiguration configuration = configurationBuilder.Build(); 
Verwandte Themen