如何解决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)));
}
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 举报,一经查实,本站将立刻删除。