【问题标题】:How to disable auto-redirect when integration testing in ASP.NET Core 3如何在 ASP.NET Core 3 中进行集成测试时禁用自动重定向
【发布时间】: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


【解决方案1】:

这是一个没有被其他人链接的问题的重复:How do I test an https redirect in ASP.NET Core?

基本上,我需要改变:


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

        protected HttpClient GetHttpClient()
        {
            var opts = new WebApplicationFactoryClientOptions
            {
                AllowAutoRedirect = false
            };
            return _factory.CreateClient(opts);
        }

【讨论】:

    【解决方案2】:

    当您构建 HttpClient 时,您可以将 AllowAutoRedirect 设置为 true 的 HttpClientHandler 传递给它。然后它不会自动重定向。

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

    编辑:当然,您必须以某种方式将其集成到您的工厂中。

    【讨论】:

    • 原来这是一个重复的问题。不能说我很惊讶。
    猜你喜欢
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2017-06-21
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    相关资源
    最近更新 更多