Можно ли загрузить профиль из файла launchSettings.json при запуске модульных тестов? - PullRequest
0 голосов
/ 05 декабря 2018

Я запускаю модульные тесты как часть решения ASP.NET Core MVC.Если быть точным, версия .NET Core - 2.1.

Я создал раздел профиля в файле launchSettings.json, который содержит переменные среды, которые я хотел бы загрузить и внедрить в программу запуска тестов, чтобыпеременные среды доступны и могут содержать конкретные значения при запуске модульных тестов.

Файл launchSettings.json из моего проекта ASP.NET Core MVC добавляется в мой проект модульных тестов в виде ссылки, и свойства устанавливаются вДействие построения - Нет, Копировать в выходную папку - Копировать всегда.

Файл копируется в мою выходную папку, но я не уверен, как заставить тестировщика использовать этот файл с профилем UnitTesting.Я пробовал использовать слово «Test» в качестве имени профиля, похоже, ничего не работает.

Вот пример файла launchSettings.json:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:62267/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "MigrationHistoryTableName": "MigrationHistory",
        "ConnectionStringName": "EFConnectionString",
        "Redis__SSL": "True",
        "Redis__Port": "6380",
        "Redis__InstanceName": "RedisDev",
        "Redis__AbortConnect": "False",
        "Redis__ConnectionString": "{URI}:{Port},password={Password},ssl={SSL},abortConnect={AbortConnect}"
      }
    },
    "MyDataServices": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "MigrationHistoryTableName": "MigrationHistory",
        "ConnectionStringName": "EFConnectionString",
        "Redis__SSL": "True",
        "Redis__Port": "6380",
        "Redis__InstanceName": "RedisDev",
        "Redis__AbortConnect": "False",
        "Redis__ConnectionString": "{URI}:{Port},password={Password},ssl={SSL},abortConnect={AbortConnect}"
      },
      "applicationUrl": "http://localhost:4080/"
    },
    "UnitTesting": {
      "commandName": "Executable",
      "executablePath": "test",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "MigrationHistoryTableName": "MigrationHistory",
        "ConnectionStringName": "EFConnectionString",
        "Redis__SSL": "True",
        "Redis__Port": "6380",
        "Redis__InstanceName": "RedisDev",
        "Redis__AbortConnect": "False",
        "Redis__ConnectionString": "{URI}:{Port},password={Password},ssl={SSL},abortConnect={AbortConnect}"
      }
    }
  }
}

Я понимаю, что по умолчанию launchSettings запускаФайл .json игнорируется в git.Мы проверим наш код с версией для разработчиков этого файла, которая будет содержать пример настроек, которые, как ожидается, будут доступны в среде разработки.

Спасибо, что нашли время, чтобы прочитать это и помочьвне!

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Я создал пакет, который может вам помочь: https://www.nuget.org/packages/DotNet.Project.LaunchSettings

Вы можете найти источник здесь: https://github.com/andygjp/DotNet.Project.LaunchSettings

У меня есть похожий вариант использования для вас -Я хочу протестировать различные среды и сохраняю данные для входа в эти среды в файле launchSettings.json.

Вот как я его использую:

async Task Example()
{
  var launchSettings = VisualStudioLaunchSettings.FromCaller();
  var profiles = launchSettings.GetProfiles();
  var profile = profiles.FirstOrEmpty();

  var client = await AppEnvironment.FromEnvironment(profile.EnvironmentVariables).CreateClient();
  // use the client
}

Предполагается, что файл launchSettings.json находится вобычное место:

MyProject -> Properties -> launchSettings.json

Однако я мог бы добавить функциональность для загрузки параметров запуска по указанному пути к файлу, если вы сочтете это полезным.

В приведенном выше примере используется первый найденный профиль, однако вы также можете использовать определенный профиль.

Надеюсь, это поможет.

0 голосов
/ 06 декабря 2018

Я сейчас написал этот статический загрузчик, но это не идеально:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace MyNamespaceHere.Services.Common.Utilities
{
    public static class LaunchSettingsLoader
    {
        public static void LaunchSettingsFixture(string launchSettingsPath = "Properties\\launchSettings.json", string profileName = "UnitTesting")
        {
            using (var file = File.OpenText(launchSettingsPath))
            {
                var reader = new JsonTextReader(file);
                var jObject = JObject.Load(reader);

                var allprofiles = jObject
                    .GetValue("profiles", StringComparison.OrdinalIgnoreCase);

                // ideally we use this
                var variables = jObject
                    .GetValue("profiles", StringComparison.OrdinalIgnoreCase)
                    //select a proper profile here
                    .SelectMany(profiles => profiles.Children())
                    //.Where(p => p.Value<String> == profileName)
                    .SelectMany(profile => profile.Children<JProperty>())
                    .Where(prop => prop.Name == "environmentVariables")
                    .SelectMany(prop => prop.Value.Children<JProperty>())
                    .ToList();

                Console.WriteLine(variables?.Count);

                var profilesDictJToken = allprofiles.ToObject<Dictionary<string, JToken>>();
                var unitTestingProfile = profilesDictJToken[profileName];
                var unitTestingProfileDictJToken = unitTestingProfile.ToObject<Dictionary<string, JToken>>();
                var environmentVariables = unitTestingProfileDictJToken["environmentVariables"];
                var environmentVariablesList = environmentVariables.ToList();

                foreach (var variable in environmentVariablesList)
                {
                    var name = ((JProperty)variable).Name;
                    var value = ((JProperty)variable).Value.ToString();
                    Environment.SetEnvironmentVariable(name, value);
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...