npmtesting与手动执行不同

在我的package.json我有以下几点:

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

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

 # npm test sample test ✓ single task 1 passing 

但是当我在控制台上手动运行脚本时,它完成了所有的testing。

 # 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来运行我所有的testing?

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

  • #1175 – 通过npm test摩卡别名无法全部覆盖所有文件
  • #1115 – 有关全局模式和shell扩展的文档

解决办法是告诉你的shell把这个模式作为一个string来处理,把它们换成引号。 单引号在* nix系统上是最好的。 如果你需要Windows支持,你将不得不求助于双引号 ,这在* nix上有一些缺陷。

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

您仍然需要确保模式正确匹配文件。 但是使用这种技术可以解决不一致的行为。 行为上的差异是由npm包装你的test脚本并运行它的方式造成的。

方法来帮助:

  • 提出一个glob问题来讨论shell的兼容性。
  • 向摩卡的文档贡献一个公关,以提高意识。

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