Явное добавление контроллера в собственный веб-интерфейс Owin - PullRequest
0 голосов
/ 12 июня 2018

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

Я использовал Owin TestServer для создания сервера webapi в памяти,

См. Strathweb здесь: https://www.strathweb.com/2013/12/owin-memory-integration-testing/

Дэвид Уитни здесь: http://www.davidwhitney.co.uk/Blog/2015/01/07/testing-an-asp-net-webapi-app-in-memory/

и DontCodeTired: http://dontcodetired.com/blog/post/In-Process-Http-Server-for-Integration-Test-Faking-with-Owin-Katana-and-WebAPI

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

Как я могу использовать объект HttpConfiguration, используемый в классе WebApp.Start<**Startup**>(), чтобы использовать только один контроллер?Я имею в виду этот класс:

internal class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();
        config.EnsureInitialized();
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
        app.UseWebApi(config);
    }
}

Мне неясно, как решить эту проблему, так как все примеры в Интернете говорят о сопоставлении маршрутов HTTP, а не об удалении / добавлении маршрутов вручную.

Если у вас есть вопросы /критику, пожалуйста, добавьте комментарий, и я обновлю вопрос как можно лучше, я чувствую, что могу быть немного ограничен в том, что я могу публиковать из-за работы.

1 Ответ

0 голосов
/ 13 июня 2018

У меня есть решение, и я думаю, что оно опрятно ..

Основано на блоге Strathweb: https://www.strathweb.com/2013/08/customizing-controller-discovery-in-asp-net-web-api/

Я реализовал пользовательский DefaultAssembliesResolver, который исключает сборку, содержащуюдругой контроллер API, вызывающий эти проблемы.

Пользовательский распознаватель:

public class MyAssembliesResolver : DefaultAssembliesResolver
{
    public override ICollection<Assembly> GetAssemblies()
    {
        ICollection<Assembly> baseAssemblies = base.GetAssemblies();
        List<Assembly> assemblies = new List<Assembly>(baseAssemblies.Where(x=>!x.FullName.Contains("<nameOfAssemblyToExclude>")));            
        return assemblies;
    }
}

, а затем замените преобразователь по умолчанию в классе запуска:

config.Services.Replace(typeof(IAssembliesResolver), new MyAssembliesResolver());

Это позволило мнечтобы исключить дополнительную продукцию ApiController (которую я пытаюсь протестировать), и включить только мой ApiController для модульного тестирования в конвейере Оуэна памяти.

...