Запустите .NET Core Web API по коду - мультиплатформенность (linux / windows) - PullRequest
0 голосов
/ 26 марта 2019

Я пишу модульный тест для моего веб-API (все реализовано с использованием .Net Core 2.2).Для этого теста мне нужно отправить запрос в веб-API.Тем не менее, я не могу понять, как запустить API с помощью кода.Кажется, вы не можете запустить веб-службу с помощью кода.

Поэтому я попытался обойти это с помощью скриптов.Это хорошо работало на Windows, однако Linux вызывал некоторые проблемы.

dotnet run --project <pathToProject>

обычно запускал бы API.Однако после выполнения скрипта все сразу прекращается.Созданный экземпляр процесса C # имел ExitCode = 0 и HasExited = true.

Кто-нибудь сталкивался с такой проблемой?Или есть идеи?

Заранее спасибо

1 Ответ

1 голос
/ 28 марта 2019

Если я правильно понимаю ваш вопрос, есть очень простой способ сделать это.В nampespace Microsoft.AspNetCore.TestHost есть класс TestServer, который легко позволяет запустить тестовый сервер для вашего API.Однако есть некоторые вещи, на которые вам нужно обратить внимание, например, какую конфигурацию загружать, какие сервисы и так далее.Предпосылкой для этого является то, что вам может потребоваться смоделировать некоторые службы, такие как репозитории БД, когда вы тестируете и используете вместо этого в коллекциях памяти или что-либо, что может подойти для ваших тестов.

Вот базовая реализация.Прежде всего, в API, который вы хотите протестировать, убедитесь, что службы, которые необходимо смоделировать, зарегистрированы с помощью виртуальных методов в классе Startup.

Пример удаленного ConfigureServices метода:

public void ConfigureServices(IServiceCollection services)
        {
            RegisterDatabase(services);

        }

И реализация также в Startup.cs (я использую Mongo в этом примере):

protected virtual void RegisterDatabase(IServiceCollection services)
        {
            string mongoConnectionString = Configuration.GetConnectionString("DevCN");
            services.AddScoped<IMyDbProcessor, MyDbProcessor>(sp =>
            {
                var mongoClient = new MongoClient(mongoConnectionString);
                return new MyDbProcessor(mongoClient);
            });
        }

Обратите внимание, что классы для обработки данных относятся к API, из которого я взял этот образец.

Далее в проекте тестирования (не имеет значения, какой тестовый прогон или каркас модульного тестирования вы используете) вы создаете класс StartUp, в котором вы переопределяете регистрацию базы данных.В этом переопределении вы можете зарегистрировать макеты, например.

public class MyTestStartup : Startup
    {

        public MyTestStartup(IConfiguration configuration)
        {   
            Configuration = configuration;
        }

        protected override void RegisterDatabase(IServiceCollection services)
        {
                services.AddScoped<IMyDbProcessor>(db => new TestDbProcessor());
        }
    }

Затем, все еще в проекте модульного тестирования, вы можете создать класс для хранения вашего тестового сервера и настроить все, что вам нужно.Вот пример того, как это может выглядеть:

public class MyTestServer
    {
        //I add an HttpClient that will be used in the test methods to make the actual call
        internal HttpClient Client { get; set; }


        public MyTestServer()
        {
            IWebHostBuilder builder = new WebHostBuilder()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    IHostingEnvironment env = hostingContext.HostingEnvironment;
                    config.AddJsonFile("testsettings.json", optional: true)
                        .AddJsonFile($"testsettings.{env.EnvironmentName}.json", optional: true);
                })
                .UseStartup<MyTestStartup>();
            builder.UseSetting(WebHostDefaults.ApplicationKey, typeof(Program).GetTypeInfo().Assembly.FullName);
            var testServer = new TestServer(builder);
            Client = testServer.CreateClient();
        }
    }

Здесь обратите особое внимание на часть typeof(Program).GetTypeInfo().Assembly.FullName).«Программа» должна ссылаться на ваш Program.cs в вашем API.Затем в классе модульного теста вы можете использовать конструктор класса, чтобы создать новый сервер и получить необходимый клиент для выполнения вызовов.

_server = new MyTestServer();
            _client = _server.Client;

Теперь вы можете использовать клиент для звонков на ваш API.Каждый раз, когда вы запускаете тест, будет тестовый сервер, на котором работает ваш API. Примечание : если вы не хотите добавлять пользовательскую конфигурацию (настолько специфичную для вашей тестовой среды), вы можете упростить создание веб-сервера.

...