编程语言
首页 > 编程语言> > c#-将测试项目appSettings附加到ASP.NET Core集成测试

c#-将测试项目appSettings附加到ASP.NET Core集成测试

作者:互联网

我将在these docs之后创建ASP.NET Core集成测试(基于xUnit).我想使用自己的appsettings.json启动测试Web服务器.我的缩写文件夹结构是:

\SampleAspNetWithEfCore
\SampleAspNetWithEfCore\SampleAspNetWithEfCore.csproj
\SampleAspNetWithEfCore\Startup.cs
\SampleAspNetWithEfCore\appsettings.json
\SampleAspNetWithEfCore\Controllers\*

\SampleAspNetWithEfCore.Tests\SampleAspNetWithEfCore.Tests.csproj
\SampleAspNetWithEfCore.Tests\IntegrationTests.cs
\SampleAspNetWithEfCore.Tests\appsettings.json

然后我有这些实用程序:

public static class ServicesExtensions
{
    public static T AddOptions<T>(this IServiceCollection services, IConfigurationSection section)
        where T : class, new()
    {
        services.Configure<T>(section);
        services.AddSingleton(provider => provider.GetRequiredService<IOptions<T>>().Value);

        return section.Get<T>();
    }
}

在Startup.cs ConfigureServices(…)中,我这样做:

services.AddOptions<SystemOptions>(Configuration.GetSection("System"));

像这样引用appsettings.json部分:

"System": {
  "PingMessageSuffix": " suffix-from-actual-project"
}

到目前为止,一切都很好:这是通过强类型化方式获得的.我的控制器获取了一个反映json结构的SystemOptions实例,并且该控制器正确使用了后缀.

问题在于构建集成测试WebHost.我想使用自己的appsettings.json设置从我的真实项目中直接运行Startup,但是作为额外的一层设置,我希望添加测试csproj中的appsettings.json,并覆盖所有适用的设置.这是我来自测试项目的设置:

"System": {
  "PingMessageSuffix": " suffix-from-test-appsettings"
}

这是我尝试过的:

public class CustomWebApplicationFactory : WebApplicationFactory<Startup>
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder
            .UseStartup<Startup>()
            .ConfigureAppConfiguration(config => config
                .AddJsonFile("appsettings.json")
            );
    }
}

但是,这不起作用.如果我在控制器中遇到断点,我只会看到基础项目中的设置.控制器仅回显当前的config值,并且逻辑上返回结果也不符合预期.

The documentation在页面上的任何地方都没有提及“设置”.

底线:在运行ASP.NET Core集成测试时,如何从测试项目的appsettings.json文件中添加一层appSettings?

解决方法:

像这样解决它:

>在测试项目中为appsettings.json设置属性:

>建立内容行动
>复制到输出目录以复制(如果较新)

>使用自定义WebApplicationFactory,如下所示:

public class CustomWebApplicationFactory : WebApplicationFactory<Startup>
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();

        // Note:         ↓↓↓↓
        builder.ConfigureTestServices(services => 
            services.AddOptions<SystemOptions>(configuration.GetSection("System"))
        );
    }
}

瞧,它有效!

第一步需要使ConfigurationBuilder轻松找到您的json文件.第二步巧妙地使用… TestServices配置(如果您使用常规的ConfigureServices方法,它将在启动服务配置之前被调用并被覆盖).

脚注:评论员(关于这个问题)已经提到,最好在SUT项目中有一个appsettings.ci.json文件,并按环境(通过启动设置或WebHostBuilder进行设置)进行控制.该文档链接到一些封闭的GitHub问题,这些问题提示相同的内容:871290607153.根据您的情况和口味,这可能是更好或更惯用的解决方案.

标签:asp-net-core,xunit,integration-testing,c
来源: https://codeday.me/bug/20191024/1923950.html