Javascript 如何在mocha测试中使用Node.js全局变量

Javascript 如何在mocha测试中使用Node.js全局变量,javascript,node.js,testing,mocha.js,Javascript,Node.js,Testing,Mocha.js,我对Node.js使用的全局对象的mocha测试有问题 在索引文件中,我将值设置为全局变量 // index.js global.enums = enumTemp export default app 然后在另一个文件中使用它 // other.js status = global.enums.object.status 它是RESTAPI,如果我向服务器发出请求,它运行良好。但是,当我使用Mocha测试时,似乎无法获取Node.js全局变量的值。每个人都知道吗?你应该扔掉地球人,因为他

我对Node.js使用的全局对象的mocha测试有问题

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

// index.js
global.enums = enumTemp

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

// other.js

status = global.enums.object.status

它是RESTAPI,如果我向服务器发出请求,它运行良好。但是,当我使用Mocha测试时,似乎无法获取
Node.js全局变量的值。每个人都知道吗?

你应该扔掉地球人,因为他们很丑,这可能也会解决你的问题

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

观察这个例子:

randomnumber.js 其他.js test.js
这将两次输出相同的随机数,并且只调用一次,尽管在不同的地方需要使用
随机数
模块。

我找到了一个解决方案,通过使用摩卡挂钩设置
全局变量
,仅用于测试:

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

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

我们可以在测试中使用
global.variable
,就像在实际代码中一样。

变量必须是全局变量有什么原因吗?地球人是丑陋的,因为他们会引起各种各样的头痛。您应该考虑将该变量放入自己的模块中,并在需要时使用它。启动服务器时,我使用该变量从数据库获取数据,然后在另一个文件中使用全局变量。何时将该变量设置为全局变量?如果涉及到数据库,我觉得这就像是一个异步任务。在使用该值之前,您可能应该等待该值(如果可用):要执行此操作,您可以从获取该值的文件中导出承诺,或者从需要的位置获取该值。作为旁注,我同意@TobiKremer关于全局变量的观点。我已经使用了
Promise
来确保手头有来自数据库的数据。这里的问题是如何将全局变量与
Mocha
一起使用。我发现这个解决办法对我有效。无论如何,谢谢大家的关心。:)全局变量在正确的情况下是有价值的。”“你应该摆脱它们”是没有建设性的。在某些情况下,globals可能有帮助(设置globals.Promise到另一个Promise库)。但大多数时候,我认为你可以也应该摆脱它们,因为如果你解决了托安·特罗恩的问题,但你肯定解决了我的问题,那么状态或动作可能远离代码,这会使你更难理解和推理.IDK。我不知道,也不知道为什么我从未想过测试模块的执行时间。谢谢你,伙计。如果你的代码足够复杂(或者可能变得足够复杂),你需要编写测试,那么globals可能会伤害你,而不是帮助你,在可能的情况下摆脱它们是个好主意。然而,这并不总是可能的,特别是如果你有一个庞大的遗留代码库的话你应该摆脱它们“不是建设性的,不是因为它们很有价值,而是因为有时它们是不可避免的。无意冒犯,但我们真的在讨论全球性行为是否被视为坏习惯吗?我已经说过,如果可能的话,你应该摆脱它们(就像OP的例子)。我甚至举了一个可能有用的例子,所以你只是重复我已经说过的。全局变量中的状态在代码中被修改,与局部范围的变量相比,从本质上更难知道发生了什么。如果您需要共享状态,并且总是使用全局变量,那么接下来的工作将非常困难。
helpers/my func.js
中到底有什么内容?我可以看到它承载了某种形式的承诺,但我不知道为什么。
module.exports = require('./randomnumber');
const randomnumber = require('./randomnumber');
const other = require('./other');
console.log(randomnumber);
console.log(other);
// setup.test.js
import MyFunc from '../helpers/my-func'

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