Я хочу убедиться, что в случае, если код работает в тестовом режиме, он не случайно (случайно) обращается к неправильной базе данных. Каков наилучший способ определить, работает ли код в тестовом режиме?
Как определить, выполняется ли тест 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);
чтобы избежать регистрации ожидаемых ошибок во время тестирования, поскольку они могут помешать выводу теста.