Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检测node.js中是否正在运行mocha测试?_Node.js_Tdd_Mocha.js - Fatal编程技术网

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

如何检测node.js中是否正在运行mocha测试?,node.js,tdd,mocha.js,Node.js,Tdd,Mocha.js,我想确保代码在测试模式下运行时,不会(意外地)访问错误的数据库。检测代码当前是否在测试模式下运行的最佳方法是什么?如注释中所述,构建代码以了解测试是错误的做法。我甚至在某处甚至外面都找不到提到的话题。 然而,我可以想出一些方法来检测在测试中被启动的事实。 对我来说,摩卡并没有将自己添加到global范围中,而是添加了global.it。 所以你的支票可能是 var isInTest = typeof global.it === 'function'; 我建议您确保不会错误检测,以我的经验,添加

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

如注释中所述,构建代码以了解测试是错误的做法。我甚至在某处甚至外面都找不到提到的话题。 然而,我可以想出一些方法来检测在测试中被启动的事实。 对我来说,摩卡并没有将自己添加到
global
范围中,而是添加了
global.it
。 所以你的支票可能是

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

我建议您确保不会错误检测,以我的经验,添加对node.js测试中最可能使用的
global.sinon
global.chai
的检查。

检查
过程。argv
是一种很好的方法。

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

[
  'node',
  '/usr/local/bin/gulp',
  'test',
  '--file',
  'getSSAI.test.unit.js',
  '--bail',
  '--watch'
]
从中你可以看到,这一大口正在被使用。使用它可以使解释变得更容易


我非常同意Kirill的观点,一般来说,代码不应该知道它正在被测试(在您的情况下,也许您可以通过构造函数传入您的db绑定/连接?),对于日志记录之类的事情,我可以理解您为什么要检测它。

最简单的选择是只使用
检测mocha
[NPM包

var detectMocha = require('detect-mocha');
if(detectMocha()) {
  // doSomethingFancy
}
如果你不想那样做,那就


如果
上下文
是当前的
窗口
全局
我同意@Joshua的回答,他说检查流程。根据我的经验,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);

为了避免在测试过程中记录预期错误,因为它们会干扰测试输出。

避免这种情况的最佳方法是模拟数据层。您在哪里运行测试,以确保它们可以访问生产资源?这应该在网络级别解决。生产数据库应该只接受来自pro的连接生产机器…可能不是生产环境。我想确保测试与测试环境一起运行。如果不是,我将抛出一个错误。它现在将要生成代码以了解测试。如果有人编写了使用部署设置运行的测试,我想抛出一个错误。这个想法是为了保护一些“危险的”函数在配置错误的测试中被意外调用(如在生产系统中删除表)。另一个误用…除非进行故障排除,否则开发人员的环境不应该处理生产配置。开发人员的配置应该只能访问本地环境或至少阶段,但不能访问生产。尽管如此,所有的评论和建议都提供了答案。别忘了让社区知道它是否适合您的需要或错误这些“故障排除”案例,如果开发人员忘记他们连接到真实数据库并运行可能破坏数据的测试…上述解决方案的一个用例:格式化浏览器控制台的调试输出消息(在浏览器中运行的web应用)与终端输出(单元测试)。在前一种情况下,console.log(someObject)可以更好地使用浏览器的内置UI来探索分层数据,而在后一种情况下,console.log(JSON.stringify(someObject))可以更好地用于探索分层数据对于输出不受信任的变量更好。在某些情况下,您想知道它是否是一个测试,例如应用程序是否发送电子邮件,而您不希望它在测试中发送。我需要检查应用程序是否在测试下运行的唯一原因是检查我是否未连接到生产数据库,因为测试会清除数据库。只是纯粹的妄想症,因为它永远不会发生——但在这个行业的30年里,我看到很多事情出了问题,被宣布为“永远不会发生”。这里有一点自相矛盾。使用您不测试的代码来确保测试代码不会破坏您的生产数据库。再次,我必须向阅读本文的其他人重复,这样更好地设计您的系统,以便永远不存在与实时数据库的连接。我得到的前提是“这永远不会发生”。但是,同样的规则也适用于您的摩卡测试,可能意味着您留下了一个不好的设计模式,我希望在运行[全局安装]时为我添加关于如何解决问题的代码解释。env.npm_lifecycle_event是
未定义的
来自Windows命令行的mocha。@SimonEast我不知道这是为什么,但似乎有三件事是可能的:(1)您不是通过NPM启动node应用程序(例如使用
NPM start
),而是通过
node
调用根脚本;(2)旧版本的node不提供此变量,或者(3)Windows上的节点不提供此环境变量。
if (process.env.npm_lifecycle_event !== 'test')
  console.error(e);