Операция ввода-вывода была прервана из-за выхода из потока или запроса приложения при выполнении теста OWIN Selfhost - PullRequest
0 голосов
/ 23 мая 2019

Фон

У меня есть модульный тест, который настраивает OWIN SelfHost для моего REST API:

[Fact]

public void My_Test()
{
    const string baseAddress = "http://localhost:9000/";
    using (WebApp.Start<ApiSelfHost>(url: baseAddress))
    {
        var client = new HttpClient();
        var response = client.GetAsync(baseAddress + "api/test").Result;

        _output.WriteLine($"Status code: {response.StatusCode}");

        response.IsSuccessStatusCode.ShouldBeTrue();
    }
}

ApiSelfHost настроен так:

public class ApiSelfHost
{
    public void Configuration(IAppBuilder app)
    {
        app.UseCors(CorsOptions.AllowAll);

        var httpConfiguration = new HttpConfiguration();

        var container = httpConfiguration.ConfigureAutofac();

        app.UseAutofacMiddleware(container);
        app.UseAutofacWebApi(httpConfiguration);

        app.UseWebApi(httpConfiguration);
    }
}

Autofac настроен так:

internal static IContainer ConfigureAutofac(this HttpConfiguration source)
{
    var container = new ContainerBuilder()
        .ConfigureAutofac()
        .Build();

    source.ConfigureDependencyInjection(container);

    return container;
}

И

internal static ContainerBuilder ConfigureAutofac(this ContainerBuilder source)
{
    source.RegisterApiControllers(typeof(MyController).Assembly);

    source.Register(c => MyContextMock.Create())
        .AsImplementedInterfaces()
        .InstancePerRequest();

    return source;
}

Действие контроллера очень просто, просто проверка, чтобы увидеть, если контроллерударил:

[HttpGet]
[Route("api/test")]
public IHttpActionResult RunTest()
{
    return Ok();
}

К сожалению, точка останова в этом методе НЕ достигнут.

Симптомы

Если я запускаю тест в Debug, яполучите это исключение ошибки:

System.Net.HttpListenerException HResult = 0x80004005 Сообщение = Операция ввода-вывода была прервана из-за выхода из потока или запроса приложения Source = System StackTrace: at System.Net.HttpListener.EndGetContext (IAsyncResult asyncResult)

На черной странице с именем System.pdb не загружен .

Стоп вызова находится глубоко внутри mscorlib.ddl иЯ думаю, что не очень важно выяснить, где проблема возникает:

Callstack

Если я запускаю тест напрямую, я получаю странный результат:

Test passes but fails?

Вопрос

Что происходит и что я могу сделать, чтобы это исправить?

ОБНОВЛЕНИЕ

У меня есть некоторый прогресс, я пыталсявоссоздать проблему в изолированном проекте, который работал.Я также нашел способ исправить этот изолированный проект:

Если я инициализирую свой контроллер напрямую, вот так:

var ctrl = new MyController();

Он работает, потому что сборка контроллера активно вызывается.Тем не менее, я не могу сделать эту работу для фактического решения этого вопроса.Я продолжаю искать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...