1
votes

Échec du test unitaire Jest avec `ReferenceError` du module de package NPM

Les tests échouent après l'installation d'un package NPM (l'un de mes propres packages).

Plus précisément, j'obtiens ReferenceError: cc is not defined , la trace de la pile renvoyant à l'une des exportations de mon package NPM.

cc est un objet d'un framework de jeu (Cocos2d-x) qui est inclus dans mon projet localement.

Le framework de jeu n'est pas inclus dans mon package NPM, mais le package fait référence à l'objet en supposant que quel que soit le projet sur lequel le package est installé, le framework de jeu est déjà inclus. Donc, essentiellement, Cocos2d-x est une dépendance homologue, mais n'est pas répertoriée comme telle car ce n'est pas un package NPM lui-même.

Le code que je teste dans mon projet ne fait aucune référence au framework du jeu. Et les méthodes que j'importe depuis mon package NPM ne font aucune référence au framework de jeu. J'importe ces méthodes en utilisant la déstructuration (par exemple, import {helper1} depuis "mon-package" ).

Cela dit, je ne m'attendrais pas à ce que ce soit un problème. Mais Jest n'aime pas le fait que cc soit référencé à partir d'une exportation entièrement différente sur mon package NPM (une exportation pas importée dans le fichier testé). En d'autres termes, helper2 provoque l'échec de Jest car il fait référence à cc , mais helper2 n'est pas importé.

Comment dois-je procéder pour corriger cette erreur afin que les tests réussissent?


1 commentaires

Il peut être utile de voir du code.


3 Réponses :


2
votes

J'ai essayé de recréer un environnement similaire au vôtre et je n'ai pas pu reproduire cette erreur:


const {helper1} = require('foo');

test('helper1 returns the answer', () => {
  expect(helper1()).toBe(42);
});

Voici le contenu de ./package.json : (Comme vous pouvez le voir, il a foo comme dépendance)

module.exports = {
  helper1: () => 42,
  helper2: () => cc
};

Voici le contenu de ./ foo / package.json :

{
  "name": "foo",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT"
}

Et voici ./foo/index.js : (Comme vous pouvez le voir, helper2 fait référence à une variable globale qui n’est pas définie.)

{
  "name": "so",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "test": "jest"
  },
  "devDependencies": {
    "jest": "^24.1.0"
  },
  "dependencies": {
    "foo": "./foo"
  }
}

Maintenant, le fichier de test:

/so
  foo/
    index.js
    package.json
  answer.test.js
  package.json

Lorsque j'exécute le test ( test de fil ), le test passe sans erreur ni avertissement. Il ne semble donc pas que Jest soit dérangé par une méthode référençant un objet global qui n'est pas dans la portée.

Vous pourriez peut-être tirer parti des options de configuration de Jest:

  1. globals

    Un ensemble de variables globales qui doivent être disponibles dans tous les environnements de test.

  2. setupFiles

    Une liste de chemins vers des modules qui exécutent du code pour configurer ou installer l'environnement de test. Chaque setupFile sera exécuté une fois par fichier de test. Comme chaque test s'exécute dans son propre environnement, ces scripts seront exécutés dans l'environnement de test immédiatement avant d'exécuter le code de test lui-même.


1 commentaires

Merci d'avoir mis en place cet environnement. Votre exportation helper2 , bien que fonctionnant, a déclenché mon "moment aha", m'amenant à découvrir le problème direct, que j'ai posté. Bien que, comme mentionné dans ma réponse, je ne suis toujours pas sûr que ce test ait échoué.



-2
votes

avez-vous essayé de créer une version allégée?

Version allégée

il y a eu une discussion à ce sujet sur le forum cocos2d


0 commentaires

0
votes

Dans mon cas spécifique, le problème était dans l'une de mes exportations depuis le package NPM qui ressemblait à quelque chose comme ceci:

"jest": {
  "globals": {
    "cc": {
      "Node": null
    }
  }
}

La solution était simplement d'ajouter des globaux à la configuration Jest de mon projet, comme ceci:

// NOTE: cc is undefined, with assumption that any project installing the NPM package will have
// the required game framework
class BackgroundLayer extends cc.Node {}
export default BackgroundLayer;

Ce qui n'est toujours pas clair pour moi à ce stade est de savoir si cela doit être prévu. En d'autres termes, si Jest devait échouer à un test unitaire qui n'a rien à voir avec une exportation non importée.


0 commentaires