2
votes

Exécution de tests js - obtention de "Impossible d'utiliser l'instruction d'importation en dehors d'un module"

J'ai ajouté le type: module mais cela n'a pas aidé.

J'essaie d'exécuter des tests moka ou jest qui utilisent l' import et l' export pour les fichiers source.

Les questions existantes à ce sujet ont des spécificités différentes des miennes et je les trouve également déroutantes à suivre pour quelqu'un avec ma situation spécifique, d'autant plus que j'ai développé une réponse spécifique avec des détails non pertinents pour les questions existantes, mais pertinentes pour d'autres personnes dans ma situation.


1 commentaires

Encore une fois, vous n'avez pas fourni suffisamment d'informations dans la question pour obtenir la réponse que vous avez écrite. Les questions auto-répondues doivent encore répondre aux exigences de base.


3 Réponses :


3
votes

Vous devez utiliser un compilateur, puis utiliser les fichiers compilés lors de l'exécution des tests.

Beaucoup de références disent d'ajouter type: module mais n'en disent pas beaucoup plus.
Pour être clair, le message de base:

Successfully compiled 2 files with Babel.
 PASS  lib/app.test.js
  All tests
    ✓ Canary test (2ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total

C'est parce que vous utilisez l' import / export et que vous essayez d'exécuter les fichiers directement sans compilation.

Le mindshift ici consiste à s'habituer à éditer les fichiers dans un répertoire et à exécuter les tests dans un autre. Alternativement, certaines solutions proposent une compilation "en vol", donc ce détail est essentiellement caché et seuls les fichiers source sont utilisés.

Il existe différentes approches pour y parvenir en fonction des besoins spécifiques. Voici l'une des approches les plus simples que j'ai trouvées jusqu'à présent, en utilisant Babel pour l'étape de compilation:

  • Installer babel npm install babel --save-dev
  • Ajoutez des commandes babel dans les scripts package.json , par exemple:

    jest .
    

Maintenant, si vous exécutez:

"scripts": {
  "test": "babel src/ --out-dir lib --presets=@babel/env; jest lib/*.test.js",
  "build": "babel src/ --out-dir lib --presets=@babel/env"
},  // this was for jest but you can use mocha, etc as needed
    // Note that using preset this way eliminates the need for a specific .babel.config.json file

vous obtenez SyntaxError: Cannot use import statement outside a module , mais si vous exécutez npm t vous obtenez

SyntaxError: Cannot use import statement outside a module

À l'avenir, n'oubliez pas de:

  • Modifier les fichiers dans src/
  • Exécuter des tests dans lib/


0 commentaires

5
votes

Selon la documentation Jest , si vous vous assurez que babel-jest est installé et fournissez votre configuration Babel selon la documentation Babel , dans un fichier de configuration ou package.json par exemple:

.babelrc.json

"scripts": {
  "build": "babel src/ --out-dir lib",
  "pretest": "npm run build",
  "test": "jest lib/*.test.js"
}

Ensuite, babel-jest le récupérera automatiquement et vous n'avez pas besoin de pré-construire explicitement les fichiers pour les tester. Cela signifie également que vous n'avez pas besoin de définir des indicateurs sur la ligne de commande lors de l'appel de Babel.


Notez que si vous ne voulez effectuer une pré-construction explicitement, je vous recommande:

  1. Utiliser un pre<script> plutôt que d'avoir plusieurs étapes sur une seule ligne; et
  2. Réutiliser le script de build pour ne pas avoir à apporter de modifications à deux endroits.

Dans ton cas:

{
  "presets": [
    "@babel/env"
  ]
}


2 commentaires

Une petite prime en guise de remerciement pour votre aide continue :)


Informations supplémentaires sur script / sur docs.npmjs.com/misc/scripts



5
votes

Dans le passé, vous ne pouviez pas utiliser de modules ES (c'est-à-dire import / export ) dans Node sans transpiler votre code à l'aide de Babel. Cependant, la prise en charge des modules ES dans Node est désormais une réalité, et Jest et Mocha ont également récemment ajouté la prise en charge de l'utilisation des modules ES de manière native.

Cependant, il faut plus que simplement ajouter "type": "module" à votre package.json .

Étapes d'utilisation des modules ES natifs dans Jest

  1. Comme déjà mentionné, ajoutez "type": "module" à votre package.json

  2. Installez jest-environment-node ou jest-environment-jsdom-sixteen dans vos dépendances de développement. Par exemple:

    import lib from "./my/lib.js"
    
  3. Mettez à jour la configuration Jest dans package.json et ajoutez le paramètre testEnvironment . Par exemple:

    $ npx --node-arg=--experimental-modules --node-arg=--experimental-vm-modules jest
    
  4. Si vous utilisez une version de Node antérieure à 13.2, vous devrez ajouter deux indicateurs supplémentaires lors de l'exécution de Node: --experimental-modules et experimental-vm-modules . J'utilise npx pour exécuter les commandes, même si c'est un peu verbeux:

    "jest": {
        "testEnvironment": "jest-environment-jsdom-node"
    }
    

Cela exécutera tous vos tests Jest en utilisant les indicateurs de nœud appropriés. Je vous recommande d'en faire votre script de test dans package.json si c'est la voie à suivre.

Vous devriez maintenant pouvoir utiliser l' import / export sans Babel!

Un dernier point important: lorsque vous utilisez des modules ES natifs dans Node, vous devez utiliser l'intégralité du chemin d'importation vers vos modules locaux, y compris les extensions de fichier. Par exemple:

$ npm i -D jest-environment-node

Voici la documentation Node sur les modules ES natifs, si vous souhaitez en savoir plus à ce sujet: https://nodejs.org/dist/latest-v14.x/docs/api/esm.html

Je vous recommande également de lire ce numéro de Github pour plus de détails sur l'implémentation Jest des modules ES natifs: https://github.com/facebook/jest/issues/9430


2 commentaires

+400 (ma prime) pour une bonne réponse d'un nouveau contributeur. Bienvenue !!! Cela me donne de la joie de passer mes points de réputation à vous accueillir.


De plus, pour ceux qui utilisent une version 14.x de Node, vous n'avez besoin que de --node-arg=--experimental-vm-modules . --node-arg=--experimental-modules n'est pas nécessaire.