Использование веб-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 в среде собственного хоста, и вы можете смоделировать зависимость