【问题标题】:How do I test an https redirect in ASP.NET Core?如何在 ASP.NET Core 中测试 https 重定向?
【发布时间】:2018-09-21 19:02:10
【问题描述】:

最近,我想出了用于检查我的 ASP.NET Core 2.1 应用程序的一些重定向规则的单元测试:

[Fact(DisplayName = "lowercase path")]
public async Task LowercaseRedirect()
{
    var result = await this.Client.GetAsync("/BLOG/");
    Assert.EndsWith("/blog/", result.RequestMessage.RequestUri.PathAndQuery, StringComparison.InvariantCulture);
}

[Fact(DisplayName = "add missing slash")]
public async Task SlashRedirect()
{
    var result = await this.Client.GetAsync("/blog");
    Assert.EndsWith("/blog/", result.RequestMessage.RequestUri.PathAndQuery, StringComparison.InvariantCulture);
}

仅供参考:我目前正在将WebApplicationFactory<TEntryPoint> 注入我的测试类,我用它来创建我的HttpClient。

但现在我很好奇如何检查 https 重定向是否有效。任何想法如何做到这一点?在此先感谢:)

【问题讨论】:

  • 您应该禁用httpclient的自动重定向功能,然后在响应头中测试Location值

标签: c# unit-testing asp.net-core dotnet-httpclient asp.net-core-2.1


【解决方案1】:

对于UseHttpsRedirection,必须有一个端口可供中间件重定向到 HTTPS。如果没有可用的端口,则不会重定向到 HTTPS。

HTTPS 端口可以通过以下任意设置来指定:

  • HttpsRedirectionOptions.HttpsPort
  • ASPNETCORE_HTTPS_PORT 环境变量。
  • 在开发中,launchsettings.json 中的 HTTPS 网址。
  • 直接在 Kestrel 或 HttpSys 上配置的 HTTPS URL。

参考:UseHttpsRedirection

要测试 UseHttpsRedirection,请指定 https 端口。您可以按照以下步骤操作:

  1. 用https_port 配置WebApplicationFactory

    public class UnitTest1 : IClassFixture<WebApplicationFactory<CoreHttps.Startup>>
    {
        private readonly WebApplicationFactory<CoreHttps.Startup> _factory;
    
    public UnitTest1(WebApplicationFactory<CoreHttps.Startup> factory)
    {
        _factory = factory.WithWebHostBuilder(builder => builder
            .UseStartup<Startup>()
            .UseSetting("https_port", "8080")); 
    }
    
  2. 默认情况下,请求 url 是http://localhost/,如果客户端没有自动重定向,请检查请求 url。

    [Theory]
    [InlineData("/Home")]
    public async Task HttpsRedirectionWithoutAutoRedirect(string url)
    {
        // Arrange
        var client = _factory.CreateClient(new WebApplicationFactoryClientOptions
                                {
                                    AllowAutoRedirect = false
                                });
        // Act
        var response = await client.GetAsync(url);
        // Assert
        Assert.Equal(HttpStatusCode.RedirectKeepVerb, response.StatusCode);
        Assert.StartsWith("http://localhost/",
            response.RequestMessage.RequestUri.AbsoluteUri);
    
        Assert.StartsWith("https://localhost:8080/",
            response.Headers.Location.OriginalString);
    }
    
  3. 如果请求是自动重定向,请检查请求 url。

    [Theory]
    [InlineData("/Home")]
    public async Task HttpsRedirectionWithAutoRedirect(string url)
    {
        // Arrange
        var client = _factory.CreateClient();
        // Act
        var response = await client.GetAsync(url);
    
        // Assert
        Assert.Equal(HttpStatusCode.OK, response.StatusCode);
        Assert.StartsWith("https://localhost:8080/",
            response.RequestMessage.RequestUri.AbsoluteUri);
    }
    

【讨论】:

  • 我想问一个问题,关于如何使用 HTTPS 进行集成测试内存服务器;你的第 1 步解决了我的问题。谢谢!
猜你喜欢
  • 2020-04-21
  • 2017-09-05
  • 2021-03-30
  • 1970-01-01
  • 2019-03-27
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多