【发布时间】:2020-02-01 18:35:27
【问题描述】:
我有一个控制器端点,它返回 RedirectRequest(状态码 308)。我正在从 ASP.NET Core 2.2 升级到 3.0,一旦 3.0 升级完成,我将升级到 3.1。我有一个在 .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 倍响应,但我想阻止这种自动重定向,以便我可以测试重定向是否在我期望的时候就位。尤其是myroute 端点解析为外部端点,因为这会在测试中创建 404,所以我无法区分端点被完全删除和重定向按预期工作之间的区别。
【问题讨论】:
-
今天学习了,标记为重复自动添加评论。
-
不,这些和我问的不一样。但是,他们引导我找到了我发布的正确副本。谢谢!
标签: c# asp.net asp.net-core asp.net-core-3.0