2016-09-30 4 views
5

Meine Webanwendung muss die Document DB-Schlüssel aus der appsettings.json-Datei lesen. Ich habe eine Klasse mit den Schlüsselnamen erstellt und Lesen des Abschnitts Config in ConfigureaServices() als:Lesen von Appsettings-JSON-Werten in .NET Core-Testprojekt

public Startup(IHostingEnvironment env) { 
     var builder = new ConfigurationBuilder() 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
      .AddEnvironmentVariables(); 

     Configuration = builder.Build(); 
    } 

    public IConfigurationRoot Configuration { get; } 

    public void ConfigureServices(IServiceCollection services) { 
     services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver()); 
     services.AddSession(); 
     Helpers.GetConfigurationSettings(services, Configuration); 
     DIBuilder.AddDependency(services, Configuration); 
    } 

Ich bin für die Wege suche, um die Schlüsselwerte in Testprojekt zu lesen.

+0

https://docs.asp.net/en/latest/fundamentals/configuration.html#configuration – Nkosi

Antwort

3

Im project.json von Ihnen Test-Projekt, fügen Sie die folgenden Abhängigkeiten:

"dependencies": { 
    "xunit": "2.2.0-beta2-build3300", 
    "Microsoft.AspNetCore.TestHost": "1.0.0", 
    "dotnet-test-xunit": "2.2.0-preview2-build1029", 
    "BancoSentencas": "1.0.0-*" 
}, 

BancoSentencas ist das Projekt, das ich testen möchten. Die anderen Pakete stammen von xUnit und dem TestHost, der unser In-Memory-Server sein wird.

auch diese Build-Option für die appsettings.json:

"buildOptions": { 
    "copyToOutput": { 
    "include": [ "appsettings.Development.json" ] 
    } 
} 

In meinem Testprojekt habe ich die folgende Testklasse:

public class ClasseControllerTeste : IClassFixture<TestServerFixture> { 

    public ClasseControllerTeste(TestServerFixture fixture) { 
     Fixture = fixture; 
    } 

    protected TestServerFixture Fixture { get; private set; } 


    [Fact] 
    public async void TestarRecuperarClassePorId() { 
     using(var client = Fixture.Client) { 
     var request = await Fixture.MyHttpRequestMessage(HttpMethod.Get, "/api/classe/1436"); 
     var response = await client.SendAsync(request); 
     string obj = await response.Content.ReadAsStringAsync(); 
     ClasseModel classe = JsonConvert.DeserializeObject<ClasseModel>(obj); 
     Assert.NotNull(classe); 
     Assert.Equal(1436, classe.Id); 
     } 
    } 
    } 

Und ich habe auch die TestServerFixture Klasse, die wird konfigurieren Sie den In-Memory-Server:

So teste ich mein Projekt. Ich verwende den Startup.cs vom Hauptprojekt, und ich eine Kopie aus dem appsettings.json in meinem Testprojekt (appsettings.Development.json)

+0

Was ist das Testserver? Ihre benutzerdefinierte Klasse? –

+0

Es ist eine Klasse aus 'Microsoft.AspNetCore.TestHost' Paket. Verwenden Sie xUnit? Ich werde meine Antwort bearbeiten und weitere Details bereitstellen. –

+0

Ja. Ich benutze auch xUnit. –

4

Ehrlich gesagt, wenn Sie Unit-Tests eine Anwendung sind, sollten Sie Versuchen Sie, die Klasse, die Sie testen, von allen Abhängigkeiten zu isolieren, wie andere Klassen aufzurufen, auf Dateisystem, Datenbank, Netzwerk usw. zuzugreifen. Es sei denn, Sie machen Integrationstests oder Funktionstests.

Mit diesem gesagt, um Unit-Test die Anwendung, möchten Sie wahrscheinlich Mock diese Werte aus Ihrer appsettings.json Datei, und nur Ihre Logik testen.

So würde Ihr appsettings.json so aussehen.

"DocumentDb": { 
    "Key": "key1" 
} 

Dann erstellen Sie eine Einstellungsklasse.

public class DocumentDbSettings 
{ 
    public string Key { get; set; } 
} 

Dann ist es in ConfigureServices() Methode registrieren.

services.Configure<DocumentDbSettings>(Configuration.GetSection("DocumentDb")); 

Dann könnte Ihr Controller/Klasse zum Beispiel so aussehen.

// ... 
private readonly DocumentDbSettings _settings; 

public HomeController(IOptions<DocumentDbSettings> settings) 
{ 
    _settings = settings.Value; 
} 
// ... 
public string TestMe() 
{ 
    return $"processed_{_settings.Key}"; 
} 

Dann können Sie in Ihrem Testprojekt eine solche Einheitenklasse erstellen.

public class HomeControllerTests 
{ 
    [Fact] 
    public void TestMe_KeyShouldBeEqual_WhenKeyIsKey1() 
    { 
     // Arrange 
     const string expectedValue = "processed_key1"; 
     var configMock = Substitute.For<IOptions<DocumentDbSettings>>(); 
     configMock.Value.Returns(new DocumentDbSettings 
     { 
      Key = "key1" // Mocking the value from your config 
     }); 

     var c = new HomeController(configMock); 

     // Act 
     var result = c.TestMe(); 

     // Assert 
     Assert.Equal(expectedValue, result); 
    } 
} 

Ich habe NSsubstitute v2.0.0-rc zum Mocking verwendet.

-1

Kopieren Sie die appSettings.json in das Stammverzeichnis des Testprojekts und markieren Sie deren Eigenschaft als Inhalt und Kopie, falls neu. var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); ConfigurationManager.Configuration = builder.Build(); ConfigurationManager ist eine Klasse und hat eine statische Eigenschaft Configuration. Auf diese Weise die gesamte Anwendung kann es nur als Zugang ConfigurationManager.Configuration []

+0

Erste Hälfte ist richtig. Die Verwendung des statischen ConfigurationManager.Configuration klingt nicht korrekt. –

1

Basierend auf http://www.jerriepelser.com/blog/using-configuration-files-in-dotnet-core-unit-tests/ Artikel (geschrieben für Core-1,0)

1.Erstellen (oder Kopie) der appsettings.json im Integrationstest Projektstamm Verzeichnis und in den Eigenschaften geben Sie "Build Action" als Inhalt und "Copy if neuher" als Ausgabeverzeichnis an.

2.Installieren Sie das JSON-Konfigurationsdatei-NuGet-Paket (Microsoft.Extensions.Configuration.Json), falls es noch nicht enthalten ist.

3.In Testprojekt erstellen Methode

public static IConfiguration InitConfiguration() 
     { 
      var config = new ConfigurationBuilder() 
       .AddJsonFile("appsettings.json") 
       .Build(); 
       return config; 
     } 
  1. Verwenden Sie die Konfiguration wie gewohnt

    var config = InitConfiguration();
    var clientId = config [ "CLIENT_ID"]

Verwandte Themen