如何检测 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.sinon
和 global.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
是当前的 window
或 global
。
我同意@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);
避免在测试期间记录预期错误,因为它们会干扰测试输出。
我想确保如果代码 运行 处于测试模式,它不会(意外地)访问错误的数据库。检测代码当前是否 运行 处于测试模式的最佳方法是什么?
正如评论中已经提到的那样,构建代码感知测试是一种不好的做法。我什至在 SO 甚至外部都找不到提到的主题。
但是,我可以想办法检测正在测试中启动的事实。
对我来说,mocha 不会将自己添加到 global
范围,而是添加 global.it
。
所以你的支票可能是
var isInTest = typeof global.it === 'function';
我建议您确保不要错误检测以添加对 global.sinon
和 global.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
是当前的 window
或 global
。
我同意@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);
避免在测试期间记录预期错误,因为它们会干扰测试输出。