如何对使用命令行参数的工具进行单元测试

Rob*_*sen 11 mocha.js command-line-arguments node.js command-line-args

我正在使用mocha为使用命令行 -args npm模块的工具编写单元测试.不幸的是,用于mocha的选项是由我的工具中的命令行参数获取的,如果我的工具中不存在这些选项,则会尽职尽责地抛出错误.例如,如果我这样做......

mocha --watch
Run Code Online (Sandbox Code Playgroud)

...然后命令行args抛出这个:

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
]);
Run Code Online (Sandbox Code Playgroud)

...但后来cli.getUsage()说我的工具有一个watch它实际上没有的选项.当然,如果我想将更多选项传递给摩卡,这种情况就会失控.

什么是"告诉"命令行参数忽略我的场景中的选项的最佳方法?

Ate*_*ral 15

您应该将工具分解为核心部分,该核心部分包含配置对象和使用该核心部分的命令行包装器.然后你只需对核心部分进行单元测试.

你的目标应该是测试核心部分,这是你写的部分; 而不是运用/测试command-line-args模块,理论上你应该相信它已被证明是由作者工作的.


Pet*_*ons 6

我会将入口点代码写入CLI应用程序,以便它可以显式地将字符串数组作为参数,仅process.argv作为默认值直接使用.然后,您可以传递各种参数列表以进行单元测试,但在生产中运行时仍能正确执行.伪代码:

function cliMain(args) {
  args = args || process.argv
  // parse args here and proceed
}
Run Code Online (Sandbox Code Playgroud)