【问题标题】:How to use Node.js global variable in mocha tests如何在 mocha 测试中使用 Node.js 全局变量
【发布时间】:2017-12-16 08:08:17
【问题描述】:

我在与 Node.js 一起使用的全局对象周围进行 mocha 测试时遇到问题。

在索引文件中,我将值设置为全局变量

// index.js
global.enums = enumTemp

export default app

然后在另一个文件中使用它

// other.js

status = global.enums.object.status

它是 REST API,如果我向服务器发出请求,它运行良好。但是,当我使用 Mocha 测试时,我似乎无法获得 Node.js global variable 的值。大家有什么想法吗?

【问题讨论】:

  • 变量必须是全局变量是否有原因?全局变量很丑,因为它们会引起各种头痛。您应该考虑将变量放在它自己的模块中,并在需要的地方使用它。
  • 这个变量是我在启动服务器时从数据库中获取数据然后在另一个文件中使用全局变量的。
  • 什么时候将变量设置为全局变量?如果涉及数据库,对我来说这听起来像是一个异步任务。您可能应该等到该值可用后再使用它:为此,您可以从获取该值的文件中导出一个 Promise,或者从您需要的地方获取该值。作为旁注,我同意@TobiKremer 关于全局变量的观点。
  • 我已经使用Promise 来确保手头有来自数据库的数据。这里的问题是如何将全局变量与Mocha 一起使用。我发现该解决方案对我有用。不管怎样,谢谢大家的关心。 :)

标签: javascript node.js testing mocha.js


【解决方案1】:

我找到了一个适合我的解决方案,方法是使用 Mocha hooks 设置 global variable 仅用于测试:

// setup.test.js
import MyFunc from '../helpers/my-func'

before((done) => {
  MyFunc.then((variable) => {
    global.variable = variable
    done()
  })
})

我们可以像在真实代码中一样在测试中使用global.variable

【讨论】:

  • helpers/my-func.js 中到底是什么?我可以看到它加载了某种形式的 Promise,但我不确定为什么。
【解决方案2】:

您应该摆脱全局变量,因为它们很丑陋,这也可能会解决您的问题。

关于 Node.js require() 的工作方式,有一个鲜为人知的事实:Modules are cached on the first require。这样就可以运行昂贵的计算(或从数据库中获取某些内容)并将其缓存在模块的后续使用中。

观察这个例子:

随机数.js

const calculateRandomNumber = limit => {
  console.log('calculateRandomNumber called');
  return parseInt(Math.random() * limit);
};

module.exports = calculateRandomNumber(1000);

其他.js

module.exports = require('./randomnumber');

test.js

const randomnumber = require('./randomnumber');
const other = require('./other');
console.log(randomnumber);
console.log(other);

这将输出两次相同随机数并且calculateRandomNumber只被调用一次,即使在不同的地方需要randomnumber模块。

【讨论】:

  • 全局变量在正确的情况下很有价值。 “你应该摆脱它们”是没有建设性的。
  • 在某些情况下,全局变量可能会有所帮助(想到将 globals.Promise 设置为不同的 Promise 库)。但是恕我直言,大多数情况下您可以而且应该摆脱它们,因为状态或动作可能远离代码,因此更难理解和推理。
  • IDK 如果你解决了 Toan Troan 的问题,但你肯定能解决我的问题。我不知道也不知道为什么我从没想过测试模块执行的时间。谢谢你的朋友。
  • 如果您的代码足够复杂(或可能变得足够复杂)以至于您需要编写测试,那么全局变量可能会伤害而不是帮助您,并且在可能的情况下摆脱它们是一种好主意。然而,这并不总是可能的,特别是如果你有一个庞大的遗留代码库。 “你应该摆脱它们”没有建设性,不是因为它们很有价值,而是因为有时它们是不可避免的。
  • 无意冒犯,但我们真的在讨论全局变量是否被认为是不好的做法吗?我已经说过你应该如果可能摆脱它们(就像在OP的例子中一样)。当它们可能有用时,我什至举了一个例子,所以你只是在重申我已经说过的话。保存在全局变量中的状态是从整个代码中修改的,与局部范围的变量相比,它本质上更难知道发生了什么。如果您需要共享状态并且总是使用全局变量,那么您将很难下线。
猜你喜欢
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 2012-06-14
  • 2020-10-09
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多