web-dev-qa-db-fra.com

AppSettings.json pour le test d'intégration dans ASP.NET Core

Je suis ce guide . J'ai un Startup dans le projet d'API qui utilise un fichier de configuration appsettings.json.

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

        Log.Logger = new LoggerConfiguration()
            .Enrich.FromLogContext()
            .ReadFrom.Configuration(Configuration)
            .CreateLogger();
    }

La partie que je regarde est le env.ContentRootPath. J'ai fait quelques recherches et il semble que mon appsettings.json ne soit pas copié dans le dossier bin, mais c'est correct, car ContentRootPath renvoie MySolution\src\MyProject.Api\, où se trouve le fichier appsettings.json.

Donc, dans mon projet de test d'intégration, j'ai ce test:

public class TestShould
{
    private readonly TestServer _server;
    private readonly HttpClient _client;

    public TestShould()
    {
        _server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
        _client = _server.CreateClient();
    }

    [Fact]
    public async Task ReturnSuccessful()
    {
        var response = await _client.GetAsync("/monitoring/test");
        response.EnsureSuccessStatusCode();

        var responseString = await response.Content.ReadAsStringAsync();

        Assert.Equal("Successful", responseString);
    }

Ceci est essentiellement copier et coller à partir du guide. Lorsque je débogue ce test, ContentRootPath est en fait MySolution\src\MyProject.IntegrationTests\bin\Debug\net461\, qui est évidemment le dossier de sortie du projet de test et encore une fois, le fichier appsettings.json n’est pas là (oui, j’ai un autre fichier appsettings.json dans le projet de test lui-même). Le test échoue lors de la création. la TestServer.

J'ai essayé de contourner ce problème en modifiant le fichier test project.json.

"buildOptions": {
    "emitEntryPoint": true,
    "copyToOutput": {
        "includeFiles": [
            "appsettings.json"
       ]
    }
}

J'espérais que cela copierait le fichier appsettings.json dans le répertoire de sortie de la construction, mais il se plaignait du manque d'une méthode Main dans le projet, ce qui traitait le projet de test comme un projet de console.

Que puis-je faire pour contourner cela? Est-ce que je fais quelque chose de mal?

16
Kevin Lee

Finalement, j'ai suivi ce guide , en particulier la section Integration Testing vers le bas de la page. Cela évite de copier le fichier appsettings.json dans le répertoire de sortie. Au lieu de cela, il indique au projet de test le répertoire réel de l'application Web.

En ce qui concerne la copie du appsettings.json dans le répertoire de sortie, j’ai également réussi à le faire fonctionner. Combinée à la réponse de (dudu} _, j'ai utilisé include au lieu de includeFiles pour que la section résultante ressemble à ceci:

"buildOptions": {
    "copyToOutput": {
        "include": "appsettings.json"
    }
}

Je ne suis pas tout à fait sûr de savoir pourquoi cela fonctionne, mais ça marche. J'ai jeté un coup d'œil à la documentation, mais je n'ai pas trouvé de réelle différence. Puisque le problème initial était essentiellement résolu, je n'ai pas cherché plus loin.

8
Kevin Lee

Test d'intégration sur ASP.NET.Core 2.0 suivez MS Guide

Vous devez cliquer avec le bouton droit sur appsettings.json et définir sa propriété Copy to Output directory sur Copier toujours

Et maintenant, vous pouvez trouver le fichier JSON dans le dossier de sortie et construire TestServer avec 

var projectDir = System.IO.Directory.GetCurrentDirectory();
_server = new TestServer(new WebHostBuilder()
    .UseEnvironment("Development")
    .UseContentRoot(projectDir)
    .UseConfiguration(new ConfigurationBuilder()
        .SetBasePath(projectDir)
        .AddJsonFile("appsettings.json")
        .Build()
    )
    .UseStartup<TestStartup>());

Ref: TestServer w/WebHostBuilder ne lit pas appsettings.json sur ASP.NET Core 2.0, mais cela a fonctionné sous 1.1

11
John_J

Supprimez "emitEntryPoint": true dans le fichier test project.json.

1
dudu