如何检测mocha测试是否在node.js中运行?

Mic*_*arf 14 tdd mocha.js node.js

我想确保代码在测试模式下运行时,它不会(意外地)访问错误的数据库.检测代码当前是否在测试模式下运行的最佳方法是什么?

Kir*_*tin 22

正如评论中已经提到的那样,构建代码意识到测试是不好的做法.我甚至无法在SO甚至外面找到提到的话题.但是,我可以想办法检测在测试中启动的事实.对我来说,摩卡不会将自己添加到global范围,但补充说global.it.所以你的支票可能是

var isInTest = typeof global.it === 'function';
Run Code Online (Sandbox Code Playgroud)

我建议你确保你没有错误检测添加检查global.sinon以及global.chai你最有可能在node.js测试中使用.

  • 在某些情况下,您想知道它是否是测试,例如应用程序是否发送电子邮件而您不希望它在测试中发送它。 (4认同)
  • 另一个用例是在代码中使用断言,您不介意减慢测试速度,但无法在生产中使用断言。 (2认同)
  • 上述解决方案的一个用例:格式化浏览器控制台(在浏览器中运行的 Web 应用程序)与终端输出(单元测试)的调试输出消息。在前一种情况下,console.log(someObject) 更适合使用浏览器的内置 UI 探索分层数据,而在后一种情况下,console.log(JSON.stringify(someObject)) 更适合输出未截断的变量。 (2认同)

Jos*_*hua 5

根据我的经验,检查process.argv是一个很好的方法。

例如,如果我console.log(process.argv)在测试期间得到以下信息:

[
  'node',
  '/usr/local/bin/gulp',
  'test',
  '--file',
  'getSSAI.test.unit.js',
  '--bail',
  '--watch'
]
Run Code Online (Sandbox Code Playgroud)

从中可以看到正在使用gulp。使用yargs使得解释这一点变得更加容易。

我强烈同意基里尔的观点,一般来说,代码不应该知道它正在被测试的事实(在你的情况下,也许你可以通过构造函数传递你的数据库绑定/连接?),对于诸如日志记录之类的事情,我可以明白为什么您可能想检测到这一点。

  • 我需要检查应用程序是否正在测试中运行的唯一原因是检查我是否未连接到生产数据库,因为测试会清除数据库。只是纯粹的偏执,因为它永远不应该发生——但在这个行业的 30 年里,我看到了很多被宣称“永远不会发生”的问题。 (12认同)