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?
3 Réponses :
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:
globals
Un ensemble de variables globales qui doivent être disponibles dans tous les environnements de test.
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.
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é.
avez-vous essayé de créer une version allégée?
il y a eu une discussion à ce sujet sur le forum cocos2d
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.
Il peut être utile de voir du code.