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 )也容易出现此问题,并且解决方法也适用于它们。