Как HttpServer In-Memory знает, какой проект WebAPI для размещения?
Я хочу запустить тесты против проекта WebAPI с использованием популярной стратегии размещения в памяти.
Мои тесты находятся в отдельном проекте.
Здесь начало моего теста
[TestMethod]
public void TestMethod1()
{
HttpConfiguration config = new HttpConfiguration();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new {id = RouteParameter.Optional});
HttpServer server = new HttpServer(config);
HttpMessageInvoker client = new HttpMessageInvoker(server)
}
Клиент инициализируется HttpServer, устанавливая прямое соединение клиент-сервер.
Помимо предоставления информации о конфигурации маршрута, как HttpServer знает, какой проект WebAPI для размещения?
Как одновременно размещать несколько проектов WebAPI?
Кажется, HttpServer делает некоторые магии для поиска проектов WebAPI?
Спасибо
Ответы
Ответ 1
Веб-API зависит от службы под названием IAssembliesResolver
, чтобы получить все сборки и сканировать их, чтобы найти контроллеры, которые реализуют интерфейс IHttpController
.
Теперь иногда веб-API может оказаться неспособным найти ваш контроллер в зависимости от того, была ли сборка загружена в текущий домен приложения или нет. В этом случае вам нужно будет убедиться, что ваша сборка загружена.
Посмотрев на примерный тестовый код, похоже, что вы не ссылаетесь на какой-либо тип из вашего проекта веб-API, и в этом случае я предполагаю, что сборка проекта веб-API не будет загружена.
Также вы, похоже, снова регистрируете маршруты в своем тесте. Я бы предложил использовать WebApiConfig.Register(HttpConfiguration)
вашего проекта веб-API для выполнения всех материалов регистрации. Таким образом, вы будете тестировать те же параметры, что и в вашем проекте веб-API.
Примечания:
-
При выполнении тестов с использованием сервера в памяти ваши запросы/ответы не будут проходить процесс сериализации/десериализации форматировщика, что опасно, поскольку во время них могут возникать реальные проблемы. Поэтому вам нужно будет позаботиться об этом. Долгое время назад я написал сообщение в блоге об этом. Вы можете проверить это здесь.
-
Инструмент Fiddler очень полезен для поиска необработанных запросов/ответов для диагностики любых проблем. Вы бы потеряли эту способность, если вы проводите тестирование в памяти.
Ответ 2
Web Api должен найти все ваши контроллеры, которые наследуют ApiController. Пока все ваши контроллеры находятся в одном и том же решении, он должен работать нормально. У меня очень похожая настройка, которая запускает тесты с использованием встроенного httpserver в памяти с контроллерами в другом проекте. Это дает мне возможность выполнять очень быстрые "интеграционные" тесты в моем проекте unit test.
Ответ 3
Просто убедитесь, что вы вызываете какой-либо контроллер из проекта web api в свой отдельный проект, чтобы гарантировать, что проект веб-api загружен в память. Пример:
[TestMethod]
public void TestMethod1()
{
//// So that the web api project is loaded in-memory
{webapi Project name}.Controller.{controllerName} = new {controller name}() ;
HttpConfiguration config = new HttpConfiguration();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new {id = RouteParameter.Optional});
HttpServer server = new HttpServer(config);
HttpMessageInvoker client = new HttpMessageInvoker(server)
}