Использование веб-API SelfHost для тестов Specflow

У меня есть сервисный проект (WebAPI) и клиентский проект, который может получить доступ к сервисному API. Я хотел бы сделать сквозной тест с использованием Specflow (или что-то подобное). Я хотел бы контролировать настройку сервиса из тестов, чтобы я мог использовать mocks/stubs/dummies там, где это необходимо.

Когда WCF был самым крутым, я проводил подобные тесты, создавая экземпляры своих сервисов и размещая их со стандартным.Net ServiceHost. Все программно. Оно работало завораживающе. Я хотел бы сделать нечто подобное с моей службой Web API, поэтому я подумал, что самохостинг - это путь. Но по какой-то причине ДЕЙСТВИТЕЛЬНО трудно добираться до работы (как, я еще не преуспел).

Кто-нибудь имел какие-либо положительные результаты, делая что-то подобное? Я бы предпочел не привлекать Нэнс для этого, если только это не единственный способ.

Что мне нужно: 1. Запустить сервисы программно, чтобы контролировать, как настроен сервис (какие зависимости вводить и т. Д.) 2. Вызвать методы на клиентском API (или просто выполнять веб-запросы из теста), попав в сервис, который я только что запущенный. 3. Производительность на самом деле не проблема, но ясность кода есть.

Кто-нибудь?

Окончательное решение:

Моя проблема на самом деле не была связана с хостингом. У меня был параметр для моего метода Get с пользовательским маршрутом:

    [Route("api/PermissionChoice/{customerId}")]
    public IEnumerable<PermissionChoice> Get(Guid customerId)

Но пользовательский маршрут не применяется при запуске собственного хоста. Необходима конфигурация с учетом пользовательского маршрута.

Конечный результат выглядит так:

    [Fact]
    public void WhatDoesItTest()
    {
        using (WebApp.Start<Startup>(_baseAddress))
        {
            var client = new HttpClient();
            var response = client.GetAsync(_baseAddress + "api/PermissionChoice/4351A155-3F4B-46CE-9C7A-4BA377D5FDDF").Result;
            var permissionChoices = response.Content.ReadAsAsync<IEnumerable<PermissionChoice>>().Result;
            permissionChoices.First().PermissionId.Should().NotBeEmpty();
        }
    }

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            config.Routes.MapHttpRoute(
                name: "Default",
                routeTemplate: "api/{controller}/{customerId}",
                defaults: new {customerId = RouteParameter.Optional});

            var container = new WindsorContainer();
            container.Install(FromAssembly.This());
            config.DependencyResolver = new WindsorDependencyResolver(container);

            app.UseWebApi(config);
        }
    }

1 ответ

Решение

Вы можете создать собственный хост и разместить свои контроллеры, а также смоделировать зависимости на основе настроек контроллера.

public static class HttpClientFactory
{
    private static HttpClient httpClient;

    public static HttpClient Create()
    {
        if (httpClient == null)
        {
            var baseAddress = new Uri("http://localhost:8081");
            var configuration = new HttpSelfHostConfiguration(baseAddress);
            var selfHostServer = new HttpSelfHostServer(configuration);

            httpClient = new HttpClient(selfHostServer) {BaseAddress = baseAddress};

            return httpClient;
        }
        return httpClient;
    }
}
}

Этот хост веб-API в среде собственного хоста, и вы можете смоделировать зависимость

Другие вопросы по тегам