c# - 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
不被调用。
解决方案
推荐阅读
- sql - (SQL) 编写存储过程以跨多列用数字替换月份(例如 jan-2 到 1/2)
- kotlin - 父母与同类型的孩子 - 如何映射它?
- java - xmlMapper 允许在反序列化期间使用任何根元素
- amazon-web-services - 在 AWS Ubuntu(18.04) Nginx 上安装 SSL 证书(从 Godaddy 购买)
- python - pip/pip3 install kivy 在终端中不起作用(已编辑)
- vue.js - 前端和后端之间的 HTTPS
- javascript - 验证字符串是否为日期
- javascript - 是否可以在自定义 HTML 表单上记录有关“来源”、“媒体”和“活动”的潜在客户分析?
- amazon-s3 - 是否可以使用 Spring Cloud for AWS 按前缀过滤存储桶?
- java - 单击列表视图中自定义单元格中按钮的侦听器