如何检测 node.js 中的 mocha 测试是否为 运行?

How to detect if a mocha test is running in node.js?

我想确保如果代码 运行 处于测试模式,它不会(意外地)访问错误的数据库。检测代码当前是否 运行 处于测试模式的最佳方法是什么?

正如评论中已经提到的那样,构建代码感知测试是一种不好的做法。我什至在 SO 甚至外部都找不到提到的主题。 但是,我可以想办法检测正在测试中启动的事实。 对我来说,mocha 不会将自己添加到 global 范围,而是添加 global.it。 所以你的支票可能是

var isInTest = typeof global.it === 'function';

我建议您确保不要错误检测以添加对 global.sinonglobal.chai 的检查,您最有可能在 node.js 测试中使用它们。

根据我的经验,检查 process.argv 是一个很好的方法。

例如,如果我 console.log(process.argv) 在测试期间我得到以下结果:

[
  'node',
  '/usr/local/bin/gulp',
  'test',
  '--file',
  'getSSAI.test.unit.js',
  '--bail',
  '--watch'
]

从中可以看出正在使用gulp。使用 yargs 可以更轻松地解释这一点。

我强烈同意 Kirill 的观点,一般来说,代码不应该知道它正在被测试的事实(在你的情况下,也许你可以通过构造函数传递你的数据库绑定/连接?),比如logging 我可以明白为什么你可能想要检测这个。

最简单的选择是只使用 detect-mocha [NPM 包。

var detectMocha = require('detect-mocha');
if(detectMocha()) {
  // doSomethingFancy
}

如果您不想这样做,relevant code 就是

function isMochaRunning(context) {
  return ['afterEach','after','beforeEach','before','describe','it'].every(function(functionName){
    return context[functionName] instanceof Function;
})

其中 context 是当前的 windowglobal

我同意@Joshua 的回答,他说根据我的经验,检查 process.argv 是一个很好的方法。

所以,我写了一个简单的检测摩卡代码。

const _MOCHA_PATH = new RegExp('(\\|/)node_modules\1mocha\1bin\1_mocha$');
var isMochaRunning = process.argv.findIndex(arg => _MOCHA_PATH.test(arg)) > -1;

在一个没有日志基础设施的小项目中,我使用

if (process.env.npm_lifecycle_event !== 'test')
  console.error(e);

避免在测试期间记录预期错误,因为它们会干扰测试输出。