Как отключить автоматическое перенаправление при тестировании интеграции в ASP. NET Core 3 - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть конечная точка контроллера, которая возвращает RedirectRequest (код состояния 308). Я обновляюсь с ASP. NET Core 2.2 до 3.0 и обновлю до 3.1 после завершения обновления 3.0. У меня был интеграционный тест, который работал. NET 2.2, который сделал запрос к моей перенаправленной конечной точке и подтвердил, что он возвращает 308. У меня также был тест, который подтвердил, что моя /swagger конечная точка перенаправлена ​​на /swagger/index.html. Похоже, что оба эти теста теперь видят ответ перенаправления и автоматически перенаправляют. Мой тест /swagger возвращает 200 с содержанием /swagger/index.html. Мой редирект на внешний URL-адрес, который не существует, возвращает 404 (я использую тест HttpClient, поэтому реальные сайты не загружаются).

Контроллер:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace MyService.Controllers
{
    [ApiController]
    public class MyController : ControllerBase
    {
        [HttpGet]
        [Route("myroute")]
        [ProducesResponseType(308)]
        [AllowAnonymous]
        public IActionResult MyEndpoint()
        {
            return new RedirectResult("https://google.com/", true, true);
        }
    }
}

Мои тесты:

using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Reflection;
using System.Threading.Tasks;
using Xunit;

namespace MyService.UnitTests.ControllerTests
{
    public class MyControllerTests : IClassFixture<ControllerTestWebApplicationFactory<Startup>>
    {
        private readonly ControllerTestWebApplicationFactory<Startup> _factory;

        public MyControllerTests(ControllerTestWebApplicationFactory<Startup> factory)
        {
            _factory = factory;
        }

        private HttpClient GetHttpClient()
        {
            return _factory.CreateClient();
        }

        [Fact]
        public async Task RedirectTest()
        {
            using (var client = GetHttpClient())
            {
                var request = new HttpRequestMessage(HttpMethod.Get, "/myroute");
                var response = await client.SendAsync(request);

                await response.AssertStatus(StatusCodes.Status308PermanentRedirect);
                var res = await response.Content.ReadAsStringAsync();
                Assert.Empty(res);
                Assert.Equal("https://google.com", response.Headers.Location.AbsoluteUri);
            }
        }

        [Fact]
        public async Task Swagger()
        {
            using (var client = GetHttpClient())
            {
                var request = new HttpRequestMessage(HttpMethod.Get, "/swagger");
                var response = await client.SendAsync(request);

                // This code passes in 2.2
                // await response.AssertStatus(StatusCodes.Status308);
                // var res = await response.Content.ReadAsStringAsync();
                // Assert.Empty(res);
                // Assert.Equal("swagger/index.html", response.Headers?.Location.OriginalString);

                // This code passes in 3.0
                await response.AssertStatus(StatusCodes.Status200OK);
                var res = await response.Content.ReadAsStringAsync();
                Assert.StartsWith("<!-- HTML for static distribution bundle", res);
                Assert.Null(response.Headers?.Location);
            }
        }
    }
}

Похоже, что тесты разрешают 30-кратный ответ на конечное местоположение, но я хочу предотвратить это Automati c редирект, чтобы я мог проверить, что перенаправление на месте, когда я ожидаю Особенно с конечной точкой myroute, которая преобразуется во внешнюю конечную точку, так как это создает 404 в тесте, я не смог бы определить разницу между конечной точкой, которая полностью удаляется, и перенаправлением, работающим, как и ожидалось.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Это дубликат вопроса, который не был связан другими: Как мне проверить перенаправление https в ASP. NET Core?

В принципе, мне нужно было изменить:


        private HttpClient GetHttpClient()
        {
            return _factory.CreateClient();
        }

на

        protected HttpClient GetHttpClient()
        {
            var opts = new WebApplicationFactoryClientOptions
            {
                AllowAutoRedirect = false
            };
            return _factory.CreateClient(opts);
        }
0 голосов
/ 01 февраля 2020

Когда вы строите HttpClient, вы можете передать HttpClientHandler с AllowAutoRedirect, установленным в true. Тогда он не будет автоматически перенаправлять.

var httpClient = new HttpClient(new HttpClientHandler{ AllowAutoRedirect = true });

Редактировать: Конечно, вам придется каким-то образом интегрировать это в вашу фабрику.

...