单元测试是否将 Cors 添加到 ServiceCollection

Unit test if Cors is added to the ServiceCollection

我正在尝试对 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);
}

有没有更好的测试方法?可以获取策略名称并进行测试吗?

如果你想写一个依赖于how CorsOptions currently works internally的冒烟测试,你可以这样写:

[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 自己使用了一种相当不同的方法,并且 start up npm using cmd and actually run JavaScript in a browser to test 如果 CORS 按预期工作。

如果你是 using ASP.NET Core's integration testing setup,你可以通过检查模拟请求的 headers 来做类似的事情,并且减少对扩展方法内部的依赖,更好地测试你真正关心的事情关于:headers 根据您的回复。