如何测试使用的命令行参数?

How can you test command line arguments used?

我有一些代码可以创建配置,添加一些环境变量,然后,如果它们存在,添加一些命令行参数。此处的目的是命令行参数可以覆盖环境变量。所以我想测试一下,如果使用同名的环境变量和命令行参数,命令行参数会覆盖环境变量。

这很可能是针对 uris 之类的东西。

所以我的代码是这样的:

public static DoSomeConfigStuff()
{
    var builder = new ConfigurationBuilder();
    builder.AddEnvironmentVariables();
    var commandLineArgs = Environment.GetCommandLineArgs();

    if(commandLineArgs != null)
    {
        builder.AddCommandLine(commandLineArgs);
    }

    var root = builder.build();

    // set various uris using root.GetValue<string>("some uri name")
}

我想对此进行测试,以便在提供命令行参数时使用它提供的 uri,特别是在它同时作为环境变量和命令行参数提供的情况下。有没有办法做到这一点?我读到人们通过使用环境变量有效地模拟命令行参数,但这在这里不起作用,因为我想在设置两者时进行测试。

你还需要这个逻辑吗?只需无条件地添加命令行参数,IConfiguration 将首先处理使用命令行参数,然后回退到环境变量。您真的不需要对此进行单元测试,因为这是 ConfigurationBuilder 的一个函数,而不是您的代码(但如果您愿意,可以对其进行测试)。

var root = new ConfigurationBuilder()
  .AddEnvironmentVariables()
  .AddCommandLine(Environment.GetCommandLineArgs())
  .Build();

如果您确实需要这样做,请将构建 IConfigurationRoot 与从环境中获取数据分开。前一步可以单元测试,后面不需要:

// This method can be unit tested
IConfigurationRoot BuildConfiguration(string[] commandLineArgs)
{
    var builder = new ConfigurationBuilder();
    builder.AddEnvironmentVariables();
    if (commandLineArgs != null)
    {
         builder.AddCommandLine(commandLineArgs);
    }

    return builder.Build()
}

// This method is NOT unit tested
public static DoSomeConfigStuff()
{
    var root = BuildConfiguration(Environment.GetCommandLineArgs());
    // set various uris using root.GetValue<string>("some uri name")
}