单元测试是否将 Cors 添加到服务集合中



我正在尝试单元测试ServiceCollection是否包含Cors。

public static class ServiceExtensions
{
    public static void ConfigureCors(this IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder => builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());
        });
    }
}

以下是我到目前为止能够写的内容,

[Fact]
private void Extension_ShouldSetCors()
{
    IServiceCollection services = new ServiceCollection();
    services.ConfigureCors();
    Assert.True(services.Count > 0);
}

有没有更好的方法来测试它?可能会获取策略名称并对其进行测试?

如果你想编写一个依赖于CorsOptions当前内部工作方式的冒烟测试,你可以按照以下思路编写一些内容:

[Fact]
public void Extension_ShouldSetCors()
{
    IServiceCollection services = new ServiceCollection();
    services.ConfigureCors();
    Assert.True(services.Count > 0);
    using (var scope = services.BuildServiceProvider().CreateScope())
    {
        var options = scope.ServiceProvider.GetService<IOptions<CorsOptions>>();
        Assert.NotNull(options);
        Assert.NotNull(options.Value);
        var expectedPolicy = options.Value.GetPolicy("CorsPolicy");
        Assert.True(expectedPolicy.AllowAnyOrigin);
        Assert.True(expectedPolicy.AllowAnyMethod);
        Assert.True(expectedPolicy.AllowAnyHeader);
        Assert.True(expectedPolicy.SupportsCredentials);
    }
}

请注意,Microsoft自己使用一种相当不同的方法,并使用cmd启动npm,并在浏览器中实际运行JavaScript以测试CORS是否按预期工作。

如果您使用的是 Core 的集成测试设置,则可以通过检查模拟请求 ASP.NET 标头来执行类似操作,并且较少依赖扩展方法的内部结构,并更好地测试您真正关心的事情:响应上的标头。

最新更新