微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

System.CommandLine 不会调用 Moq 对象上的方法

如何解决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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?