Как 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)
}