npm测试与手动执行不同

时间:2016-12-28 00:18:23

标签: node.js npm

在我package.json我有以下内容;

"scripts": {
  "test": "NODE_ENV=test mocha **/*.spec.js"
}

当我运行npm test时,它只在我的子目录中完成一个测试。

# npm test

sample test
  ✓ single task

1 passing

但是当我在我的控制台中手动运行脚本时,它会完成所有测试。

# NODE_ENV=test mocha **/*.spec.js

sample test
  ✓ single task

sample test x2
  ✓ single task x1
  ✓ single task x2
  ✓ single task x3
  ✓ single task x4
  ✓ single task x5

sample test x3
  ✓ single task x1
  ✓ single task x2
  ✓ single task x3
  ✓ single task x4
  ✓ single task x5
  ✓ single task x6

sample test x4
  ✓ single task x1
  ✓ single task x2
  ✓ single task x3
  ✓ single task x4


16 passing (15s)

为什么运行相同的命令会有区别?以及如何让npm test运行我的所有测试?

1 个答案:

答案 0 :(得分:2)

这是一个已知问题,由mocha用于globbing的语法引起,该语法在许多机器上与shell本身的globbing系统冲突。如果你不小心,shell会在mocha甚至有机会看到之前评估并扩展它。

解决方案是通过将模式包装在引号中,告诉shell将模式视为字符串文字。单引号最适合* nix系统。如果您需要Windows支持,则必须使用escaped double quotes,这在* nix上有一些陷阱。

NODE_ENV=test mocha '**/*.spec.js'

您仍需要确保模式正确匹配文件。但使用此技术将解决不一致的行为。行为的差异是由npm包装test脚本并运行它的方式引起的。

如何提供帮助:

请注意,依赖glob的其他CLI工具(例如eslint)也容易受到此问题的影响,并且解决方法也适用于它们。