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

落花浮王杯 提交于 2019-11-30 17:49:36

As already mentioned in comment it is bad practice to build your code aware of tests. I even can't find mentioned topic on SO and even outside. However, I can think of ways to detect the fact of being launched in test. For me mocha doesn't add itself to global scope, but adds global.it. So your check may be

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

I would suggest to be sure you don't false-detect to add check for global.sinon and global.chai which you most likely used in your node.js tests.

Inspecting process.argv is a good approach in my experience.

For instance if I console.log(process.argv) during a test I get the following:

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

From which you can see that gulp is being used. Using yargs makes interpretting this a whole lot easier.

I strongly agree with Kirill and in general that code shouldn't be aware of the fact that it's being tested (in your case perhaps you could pass in your db binding / connection via a constructor?), for things like logging I can see why you might want to detect this.

Easiest option is to just use the detect-mocha [NPM package.

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

If you don't want to do that, the relevant code is just

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

Where context is the current window or global.

I agreed with @Joshua on his answer, he says Inspecting process.argv is a good approach in my experience.

So, I've written a simple detecting mocha code.

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

In a small project with no logging infrastructure, I use

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

to avoid logging expected errors during testing, as they would interfere with test output.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!