web-dev-qa-db-fra.com

Comment utiliser la variable globale Node.js dans les tests mocha

J'ai un problème avec les tests mocha autour d'un objet global que j'utilise avec Node.js.

Dans le fichier d'index, j'ai mis la valeur à la variable globale

// index.js
global.enums = enumTemp

export default app

Et puis utilisé dans un autre fichier

// other.js

status = global.enums.object.status

C'est REST API et fonctionne bien si j'ai fait une demande à un serveur. Cependant, lorsque j'utilise un test Mocha, il semble que je ne peux pas obtenir la valeur de Node.js global variable. Une idée tout le monde?

10
Toan Tran

J'ai trouvé une solution qui fonctionne pour moi en utilisant Mocha hooks pour définir global variable juste pour tester:

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

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

Nous pouvons utiliser le global.variable dans le test comme dans le vrai code.

12
Toan Tran

Vous devriez vous débarrasser des globaux car ils sont laids, ce qui résoudra probablement votre problème également.

Il y a un fait peu connu sur le fonctionnement de Node.js require(): Les modules sont mis en cache lors de la première demande. Cela permet d'exécuter des calculs coûteux (ou d'extraire quelque chose de la base de données) et de le mettre en cache lors des utilisations ultérieures du module.

Observez cet exemple:

randomnumber.js

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

module.exports = calculateRandomNumber(1000);

other.js

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

test.js

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

Cela produira deux fois le même nombre aléatoire et calculateRandomNumber sera appelé une seule fois, même si le module randomnumber a été requis dans différents endroits.

1
Tobi Kremer