如何对使用命令行参数的工具进行单元测试
How to unit test a tool that uses command-line-args
我正在使用 mocha 为使用 command-line-args npm 模块的工具编写单元测试。不幸的是,用于 mocha 的选项由我工具中的命令行参数获取,如果我的工具中不存在这些选项,它会尽职地抛出错误。例如,如果我这样做...
mocha --watch
...然后命令行参数抛出这个:
UNKNOWN_OPTION: Unknown option: --watch
我可以通过在我的工具中做类似的事情来解决这个问题...
var cli = commandLineArgs([
{ name: 'verbose', alias: 'v', type: Boolean },
{ name: 'timeout', alias: 't', type: Number },
{ name: 'watch'} // So I can do mocha --watch
]);
...但是 cli.getUsage()
说我的工具有一个实际上没有的 watch
选项。当然,如果我想将更多选项传递给 mocha,这就会失控。
在我的场景中 "tell" 命令行参数忽略选项的最佳方法是什么?
我会将入口点代码写入您的 CLI 应用程序,以便它可以显式地将字符串数组作为参数,仅直接使用 process.argv
作为默认值。然后您可以为单元测试目的传递各种参数列表,但在生产中 运行 时仍然做正确的事情。伪代码:
function cliMain(args) {
args = args || process.argv
// parse args here and proceed
}
您应该将您的工具分解为一个核心部分,该部分接受一个配置对象和一个使用该核心部分的命令行包装器。然后你只需对核心部分进行单元测试。
你的目标确实应该是测试核心部分,也就是你写的部分;而不是 exercise/test command-line-args
模块,理论上你应该相信它已经被其作者证明是有效的。
What's the best way to "tell" command-line-args to ignore options in my scenario?
通过在 commandLineArgs
选项中设置 partial
或 stopAtFirstUnknown
标志。 Example usage in a mocha script here. Full docs here.
我正在使用 mocha 为使用 command-line-args npm 模块的工具编写单元测试。不幸的是,用于 mocha 的选项由我工具中的命令行参数获取,如果我的工具中不存在这些选项,它会尽职地抛出错误。例如,如果我这样做...
mocha --watch
...然后命令行参数抛出这个:
UNKNOWN_OPTION: Unknown option: --watch
我可以通过在我的工具中做类似的事情来解决这个问题...
var cli = commandLineArgs([
{ name: 'verbose', alias: 'v', type: Boolean },
{ name: 'timeout', alias: 't', type: Number },
{ name: 'watch'} // So I can do mocha --watch
]);
...但是 cli.getUsage()
说我的工具有一个实际上没有的 watch
选项。当然,如果我想将更多选项传递给 mocha,这就会失控。
在我的场景中 "tell" 命令行参数忽略选项的最佳方法是什么?
我会将入口点代码写入您的 CLI 应用程序,以便它可以显式地将字符串数组作为参数,仅直接使用 process.argv
作为默认值。然后您可以为单元测试目的传递各种参数列表,但在生产中 运行 时仍然做正确的事情。伪代码:
function cliMain(args) {
args = args || process.argv
// parse args here and proceed
}
您应该将您的工具分解为一个核心部分,该部分接受一个配置对象和一个使用该核心部分的命令行包装器。然后你只需对核心部分进行单元测试。
你的目标确实应该是测试核心部分,也就是你写的部分;而不是 exercise/test command-line-args
模块,理论上你应该相信它已经被其作者证明是有效的。
What's the best way to "tell" command-line-args to ignore options in my scenario?
通过在 commandLineArgs
选项中设置 partial
或 stopAtFirstUnknown
标志。 Example usage in a mocha script here. Full docs here.