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<bool>(x => x)));
}

应用服务构造函数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,overwrite);
    });
    return rootCommand.Invoke(cliArgs);
}

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...