我想确保代码在测试模式下运行时,它不会(意外地)访问错误的数据库。检测代码当前是否在测试模式下运行的最佳方法是什么?
答案 0 :(得分:19)
正如评论中已经提到的,构建代码意识到测试是不好的做法。我甚至无法在SO甚至外面找到提到的话题。
但是,我可以想办法检测在测试中启动的事实。
对我来说,mocha并没有将自己添加到global
范围,而是添加了global.it
。
所以你的支票可能是
var isInTest = typeof global.it === 'function';
我建议您确保不要进行错误检测,以便为您最有可能在node.js测试中使用的global.sinon
和global.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
是当前的window
或global
。
答案 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);
避免在测试过程中记录预期错误,因为它们会干扰测试输出。