当 appsettings.json 包含占位符时,为什么我的单元测试项目没有使用正确的 appsettings.Test.json?

问题描述 投票:0回答:1

我有一个 dotnet core 6 解决方案。在我的 API 项目中,我将 appsettings.json 设置为具有一些占位符,如下所示:

"Host": #{Logging__StdLog__QueueSettings__Host}#,
        "Port": #{Logging__StdLog__QueueSettings__Port}#,
        "Username": #{Logging__StdLog__QueueSettings__Username}#,
        "Password": #{Logging__StdLog__QueueSettings__Password}#,

这是必要的,因为我们需要在各种管道环境中替换这些值,所以我设置了我的单元测试项目以使用另一个文件进行设置,我将其称为 appsettings.Test.json,非常有创意,我知道。 我注意到,当我运行单元测试时,我收到了明显的异常

System.IO.InvalidDataException : Failed to load configuration from file 'C:\MyWorkDir\MySolution\MyProject.UnitTest\bin\Debug\net6.0\appsettings.json'.
---- System.FormatException : Could not parse the JSON file.
-------- System.Text.Json.JsonReaderException : '#' is an invalid start of a value. LineNumber: 44 | BytePositionInLine: 16.

  

考虑到在单元测试项目的program.cs中我明确指出我想使用appsettings.Test.json,这并不是那么明显:

private static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);
            ConfigurationManager configuration = builder.Configuration;
            builder.Host.ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(LogLevel.Trace);
            });
            var controllersAssembly = Assembly.Load("MyAPIProject");
            builder.Services
                .AddControllersWithViews()
                .AddApplicationPart(controllersAssembly);
            builder.Configuration.AddJsonFile("appsettings.Test.json");
            builder.Services.AddCommonOptions(configuration);
            builder.Services.AddProblemDetailsFactories();
            builder.Services.AddResultFactories();
            builder.Services.AddRepositories(configuration);
            builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
            builder.Services.AddLoggingProducer(configuration, excludeEFLogger: true);
            builder.Services.AddTraceProducer<TraceMessageProducer>(configuration);

            var app = builder.Build();
            app.UseMockServerVariables();
            app.UseHttpsRedirection();
            app.UseRouting();
            app.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");

            app.UseActivityMiddleware(true);
            app.Run();

        }

并且文件 appsettings.json 甚至不在该项目中。

我尝试了我所知道的一切,但我的测试一直尝试使用 appsettings.json 文件。 然后我尝试更改 appsettings.json,只是暂时消除占位符,将这些值设置为 null。这样,单元测试就会指向正确的 appsettings.Test.json。 有什么提示吗?

.net-core xunit appsettings
1个回答
0
投票

appsettings.json
位于您的测试项目输出目录 (
MyProject.UnitTest\bin\Debug\net6.0\
) 中,因为您的测试项目引用 API 项目,并且 API 项目可能已在
.csproj
中指定将
appsettings.json
复制到输出文件夹。

您是否检查过在测试项目输出目录中是否也有

appsettings.Test.json
文件? 如果没有,您需要配置测试项目,以便将测试文件复制到输出文件夹,以便能够使用。

否则,

WebApplication.CreateBuilder()
添加默认配置,其中包括从
appsettings.json
文件添加配置。

我现在不确定

ConfigurationManager
是如何工作的,但是
ConfigurationBuilder
的工作方式是后者添加配置,它的优先级越高,也就是说,这就是正确配置它的方式:

var config = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: false)
    .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true, reloadOnChange: false)
    .AddEnvironmentVariables()
    .Build();

您想要做同样的事情:在

appsettings.Test.json
引入的默认值之后应用
WebApplication.CreateBuilder()
,以便使用前者。

© www.soinside.com 2019 - 2024. All rights reserved.