问题描述
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 (将#修改为@)