c# - 如何在 ASP.NET Core 中测试 https 重定向?

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

最近,我想到了单元测试来检查我的 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);
}

仅供引用:我目前正在注入(inject) WebApplicationFactory<TEntryPoint> 进入我的测试类,我用它来创建我的 HttpClient .

但现在我很好奇如何检查 https 重定向是否正常工作。任何想法如何做到这一点?提前致谢:)

最佳答案

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

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

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

引用: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);
    }
    

关于c# - 如何在 ASP.NET Core 中测试 https 重定向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52449718/

相关文章:

c# - 使用移动应用程序后端在 UWP 中注销

c# - 从响应中读取文本

Python模拟多个返回值

c# - 如何使用多个子句对 Entity Framework 的异步方法进行单元测试

asp.net-mvc - 如何更改 .NET CORE 中的默认 ASP.NET Identity 表名称?

C# Linq 如何选择数据表中多列的不同行数

c# - 如何使用 RelativeSource Binding 创建 DataGrid 绑定(bind)到 Model 和 ViewModel?

objective-c - 从 Swift 测试文件调用 Objective-C 类

asp.net-core - 使用 Asp.net core 的 Swashbuckle 如何将模型添加到生成的模型列表中?

缺少 cookie 时,.NET 核心返回 500 而不是 401