У меня есть конечная точка контроллера, которая возвращает 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 в тесте, я не смог бы определить разницу между конечной точкой, которая полностью удаляется, и перенаправлением, работающим, как и ожидалось.