web-dev-qa-db-fra.com

GetEnvironmentVariable devrait-il fonctionner dans le test xUnit?

Si je définit des variables d'environnement pour un projet Web .Net Core dans Visual Studio 2017 à l'aide de la page des propriétés du projet, je peux lire la valeur de la variable à l'aide de Environment.GetEnvironmentVariable; cependant, lorsque je définis la variable d'environnement pour mon projet de test xUnit, puis que je débogue le test, Environment.GetEnvironmentVariable renvoie toujours null. Y a-t-il quelque chose dans le fait qu'il s'agit d'un projet de test qui devrait empêcher la variable d'être utilisée de la même manière qu'avec le projet Web? Si oui, existe-t-il un moyen de définir les variables d'environnement pour un projet de test? Je vous remercie.

24
Eric

GetEnvironmentVariable fonctionne très bien dans les tests xUnit. Le problème consiste à définir correctement une variable. Si vous définissez la variable sur Properties -> Debug page, puis la variable est écrite dans Properties\launchSettings.json et Visual Studio fait tout son possible pour lancer une application avec le profil sélectionné. Comme vous avez pu le voir, launchSettings.json même n'est pas copié dans le dossier de sortie par défaut. Il est impossible de passer ce fichier en argument à dotnet run ou dotnet test, cela conduit à un problème évident si les tests sont exécutés automatiquement sur un serveur CI. Il n'est donc pas surprenant que launchSettings.json n'est pas considéré par un testeur.

Solution : il existe de nombreuses façons de configurer un environnement de test dans xUnit:

Par exemple, ce montage de collection configure toutes les variables d'environnement à partir de launchSettings.json:

public class LaunchSettingsFixture : IDisposable
{
    public LaunchSettingsFixture()
    {
        using (var file = File.OpenText("Properties\\launchSettings.json"))
        {
            var reader = new JsonTextReader(file);
            var jObject = JObject.Load(reader);

            var variables = jObject
                .GetValue("profiles")
                //select a proper profile here
                .SelectMany(profiles => profiles.Children())
                .SelectMany(profile => profile.Children<JProperty>())
                .Where(prop => prop.Name == "environmentVariables")
                .SelectMany(prop => prop.Value.Children<JProperty>())
                .ToList();

            foreach (var variable in variables)
            {
                Environment.SetEnvironmentVariable(variable.Name, variable.Value.ToString());
            }
        }
    }

    public void Dispose()
    {
        // ... clean up
    }
}

Ensemble Copy to output directory: Always pour launchSettings.json pour rendre le fichier accessible à partir des tests.

39
Ilya Chumakov