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

时间:2015-03-21 13:03:27

标签: node.js tdd mocha

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

5 个答案:

答案 0 :(得分:19)

正如评论中已经提到的,构建代码意识到测试是不好的做法。我甚至无法在SO甚至外面找到提到的话题。 但是,我可以想办法检测在测试中启动的事实。 对我来说,mocha并没有将自己添加到global范围,而是添加了global.it。 所以你的支票可能是

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

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

答案 1 :(得分:4)

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

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

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

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

我非常同意Kirill,并且一般来说代码不应该知道它正在被测试的事实(在你的情况下,也许你可以通过构造函数传递你的数据库绑定/连接?)对于像日志记录这样的事情,我可以看到为什么你可能想要检测到它。

答案 2 :(得分:0)

最简单的选择是只使用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

答案 3 :(得分:0)

我同意@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;

答案 4 :(得分:0)

在没有日志记录基础结构的小型项目中,我使用

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

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