首页 > 解决方案 > System.CommandLine 不会调用 Moq 对象上的方法

问题描述

System.CommandLine 是来自 MS 的一个非常有用且功能强大的 NuGet 包,用于解析命令行参数。在这里,当传递一个模拟对象而不是一个真实的具体对象时,它不能正常工作。

我正在测试ApplicationService检查它是否使用正确的参数调用此方法:

IBuilderService.BuildForSingleTable(table, model, schema, overwrite)

ApplicationService设置如下:

private readonly Mock<IBuilderService> _builderMock = new();
_sut = new ApplicationService(_loggerMock.Object, _configMock.Object, _builderMock.Object);

我的测试看起来像这样:

[TestMethod]
public async Task RunAsync_with_root_command_invokes_build_single_table()
{
    // Arrange
    var tableName = "testTableName";
    var modelName = "testModelName";
    var schemaName = "testSchemaName";
    var args = new[] { tableName, "--model", modelName, "--schemaName", schemaName, "--overwrite" };

    _builderMock.Setup(x => x.BuildForSingleTable(
        It.Is<string>(s => s.Equals(tableName)), 
        It.Is<string>(s => s.Equals(modelName)), 
        It.Is<string>(s => s.Equals(schemaName)), 
        It.Is<bool>(x => x))).Verifiable();

    // Act
    await _sut.RunAsync(args);

    // Assert
    _builderMock.Verify(m => m.BuildForSingleTable(
        It.Is<string>(s => s.Equals(tableName)),
        It.Is<string>(s => s.Equals(modelName)),
        It.Is<string>(s => s.Equals(schemaName)),
        It.Is<bool>(x => x)));
}

应用服务 ctor 和RunAsync方法:

public ApplicationService(ILogger<ApplicationService> logger, IConfiguration config, IBuilderService builderService)
{
    _logger = logger;
    _config = config;
    _builderService = builderService;
}

public async Task<int> RunAsync(string[] cliArgs)
{
    var rootCommand = BuildCommandTree();

    rootCommand.Handler = CommandHandler.Create(delegate (string table, string? model, string? schema, bool overwrite, IConsole console)
    {
        _builderService.BuildForSingleTable(table, model, schema, overwrite);
    });
    return rootCommand.Invoke(cliArgs);
}

当我直接运行控制台应用程序时,Invoke返回 0 并被BuildForSingleTable调用并运行得很好。当我运行测试时,rootCommand.Invoke返回 1 并且BuildForSingleTable不被调用。

标签: c#moq

解决方案


推荐阅读