Как определить, выполняется ли тест mocha в node.js?

Я хочу убедиться, что в случае, если код работает в тестовом режиме, он не случайно (случайно) обращается к неправильной базе данных. Каков наилучший способ определить, работает ли код в тестовом режиме?

Ответ 1

Как уже упоминалось в комментариях, плохая практика - создавать ваш код с учетом тестов. Я даже не могу найти упомянутую тему на SO и даже за ее пределами. Однако я могу придумать способы обнаружить факт запуска в тесте. Для меня мокко не добавляет себя в global сферу, но добавляет global.it. Так что ваш чек может быть

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

Я бы посоветовал вам убедиться, что вы не обнаружили ложное обнаружение, чтобы добавить проверку для global.sinon и global.chai которую вы, скорее всего, использовали в своих тестах global.sinon

Ответ 2

Проверка моего опыта process.argv - хороший подход.

Например, если я console.log(process.argv) во время теста, я получаю следующее:

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

Из которого вы можете видеть, что используется gulp. Использование yargs упрощает интерпретацию этого документа.

Я полностью согласен с Кириллом и вообще, что код не должен знать о том, что он тестируется (в вашем случае, возможно, вы могли бы передать свою привязку/соединение db через конструктор?), для таких вещей, как ведение журнала я может понять, почему вы можете обнаружить это.

Ответ 3

Самый простой вариант - просто использовать пакет detect-mocha [NPM.

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

Если вы не хотите этого делать, соответствующий код просто

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

Где context является текущим window или global.

Ответ 4

Я согласился с @Joshua в его ответе, он говорит, что Inspecting process.argv - хороший подход в моем опыте.

Итак, я написал простой код обнаружения мокко.

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

Ответ 5

В небольшом проекте без инфраструктуры логирования я использую

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

чтобы избежать регистрации ожидаемых ошибок во время тестирования, поскольку они могут помешать выводу теста.