Модульные тесты для ASP. NET Ошибка ядра в конвейере VSTS из-за HttpStatusCode.TeoraryRedirect - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть ASP. NET Core 2.2 WebAPI, который использует платформы xUnit и FluentAssertions. Он создает Microsoft.AspNetCore.TestHost.TestServer, и из этого серверного объекта мы создаем HttpClient с использованием Microsoft.AspNetCore.TestHost.TestServer.CreateClient() API.

Модульные тесты прекрасно работают на моей локальной машине Windows 10 с использованием Visual Studio 2017 Pro. Я зафиксировал код, затем сделал запрос на удаление. Вытягивающий запрос автоматически запускает процесс сборки, чтобы обеспечить его сборку. Как только он собирается, он ищет и запускает модульные тесты. На данный момент это не удается. У меня 242 юнит-тестов. Все 242 модульных теста завершаются неудачно с той же ошибкой, о которой сообщил агент:

Expected resp.StatusCode to be OK, but found TemporaryRedirect.

Все 242 модульных теста отправляют запрос на тестовый сервер, поэтому все они ожидают HttpStatusCode.OK (или аналогично ожидаемый) ответ. Я никогда не должен ожидать HttpStatuscode.TemporaryRedirect, поэтому я действительно не хочу добавлять тестовый пример для этого.

Сервер сборки работает в VSTS как Microsoft Server 2012 R2 с установленной Visual Studio 2017 Pro.

Почему объект TestServer будет когда-либо возвращать перенаправление?

Если нет способа обойти это, могу ли я принудительно HttpClient автоматически перенаправить, когда он получает этот статус, поэтому я получаю только результат вызова API?

Вот код, который я использую для создания сервера и клиента:

var config = new ConfigurationBuilder()
    .SetBasePath(Path.GetFullPath("../../../../XXXXXXXXService/"))
    .AddJsonFile("appsettings.json", optional: false)
    .Build();

_server = new TestServer(new WebHostBuilder().UseStartup<Startup>().UseConfiguration(config));
TestHttpClient = _server.CreateClient();

Пример модульного теста, который не проходит:

private string DeriveHttpPath(string path) =>
    $"/{_rootPath.Trim('/')}/{path.TrimStart('/')}";

private static async Task<TResult> ValidateAndReadResponseAsync<TResult>(
    HttpResponseMessage resp, HttpStatusCode statusShouldBe, Func<TResult> defFactory = null)
{
    (resp.IsSuccessStatusCode ? HttpStatusCode.OK : resp.StatusCode).Should().Be(statusShouldBe);
    try
    {
        return await resp.Content.ReadAsAsync<TResult>();
    }
    catch (Exception ex)
    {
        return defFactory != null ? defFactory.Invoke() : throw ex;
    }
}

public async Task<TResult> GetDocumentDataAsync<TResult>(string documentId,
    string path = null, HttpStatusCode statusShouldBe = HttpStatusCode.OK)
{
    using (var msg = new HttpRequestMessage(HttpMethod.Get,
        DeriveHttpPath($"{_collectionId}/{documentId}?path={path}")))
    using (var resp = await _httpClient.SendAsync(msg))
    {
        return await ValidateAndReadResponseAsync<TResult>(resp, statusShouldBe);
    }
}

_rootPath будет root контроллера, то есть: /api/MyController

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 07 апреля 2020

Проблема, с которой я столкнулся, заключалась в том, что это было определено в startup.cs:

#if !DEBUG
    app.UseHttpsRedirection();
#endif

Поэтому, когда я запускал модульные тесты локально, он был скомпилирован как Debug, где при его нажатии сервер сборки, он был скомпилирован как Release, и перенаправление Https было включено.

Я вынул этот код и сделал свой WebAPI HTTPS-Only, установив его в Azure.

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