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

时间:2019-06-20 11:23:31

标签: .net-core xunit.net

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

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

1 个答案:

答案 0 :(得分:1)

如果您要编写依赖于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本身使用的是一种完全不同的方法,如果CORS能够按预期运行,则使用start up npm using cmd和实际上run JavaScript in a browser to test

如果您using ASP.NET Core's integration testing setup,可以通过检查模拟请求的标头来做类似的事情,并且对扩展方法的内部依赖较少,可以更好地测试您真正关心的事情:响应标头