Jest: Les modules fictifs sont prioritaires sur node_modules

Créé le 13 oct. 2016  ·  3Commentaires  ·  Source: facebook/jest

Voulez-vous demander une _fonctionnalité_ ou signaler un _bug_ ?
Signaler un bug.

Quel est le comportement actuel ?
Si un projet a une dépendance sur un module portant le même nom qu'un fichier interne avec un simulacre, cette implémentation fictive est récupérée pour les demandes du module global, au lieu du module global, nécessitant un démockage explicite (qui imprime alors un avertissement, malgré affichant un changement tangible de comportement).

Si le comportement actuel est un bogue, veuillez fournir les étapes à reproduire et si possible un référentiel minimal sur GitHub que nous pouvons npm install et npm test .

  1. Clone https://github.com/ticky/jest-mock-bug , dépendances npm install
  2. Courir npm test

Le test espérant pouvoir importer le module global ( with no explicit opt-out › globalPad should not be a mock function ) échoue car le module renvoyé est en fait le simulacre manuel.

(Notez que left-pad est utilisé ici car il s'agit d'un petit module sans aucune exigence de compilation.)

Quel est le comportement attendu ?

L'instruction import doit renvoyer le module global, comme dans explicit-opt-out.js

Exécutez à nouveau Jest avec --debug et fournissez la configuration complète qu'il imprime.

jest version = 16.0.1
test framework = jasmine2
config = {
  "rootDir": "/Users/jessica/Repositories/jest-mock-bug",
  "name": "-Users-jessica-Repositories-jest-mock-bug",
  "setupFiles": [],
  "testRunner": "/Users/jessica/Repositories/jest-mock-bug/node_modules/jest-jasmine2/build/index.js",
  "scriptPreprocessor": "/Users/jessica/Repositories/jest-mock-bug/node_modules/babel-jest/build/index.js",
  "usesBabelJest": true,
  "automock": false,
  "bail": false,
  "browser": false,
  "cacheDirectory": "/var/folders/rl/98bml8qx57n3b6xgsgyvbxtr0000gn/T/jest",
  "clearMocks": false,
  "coveragePathIgnorePatterns": [
    "/node_modules/"
  ],
  "coverageReporters": [
    "json",
    "text",
    "lcov",
    "clover"
  ],
  "globals": {},
  "haste": {
    "providesModuleNodeModules": []
  },
  "mocksPattern": "__mocks__",
  "moduleDirectories": [
    "node_modules"
  ],
  "moduleFileExtensions": [
    "js",
    "json",
    "jsx",
    "node"
  ],
  "moduleNameMapper": {},
  "modulePathIgnorePatterns": [],
  "noStackTrace": false,
  "notify": false,
  "preset": null,
  "preprocessorIgnorePatterns": [
    "/node_modules/"
  ],
  "resetModules": false,
  "testEnvironment": "jest-environment-jsdom",
  "testPathDirs": [
    "/Users/jessica/Repositories/jest-mock-bug"
  ],
  "testPathIgnorePatterns": [
    "/node_modules/"
  ],
  "testRegex": "(/__tests__/.*|\\.(test|spec))\\.jsx?$",
  "testURL": "about:blank",
  "timers": "real",
  "useStderr": false,
  "verbose": null,
  "watch": false,
  "cache": true,
  "watchman": true,
  "testcheckOptions": {
    "times": 100,
    "maxSize": 200
  }
}

Commentaire le plus utile

Oui, les simulations manuelles ont priorité sur les modules de nœuds. Le système de simulations manuelles est un peu sommaire. Pour l'instant, nous supprimons l'avertissement dans la prochaine version, donc jest.unmock('left-pad') devrait être tout ce dont vous avez besoin. Voir #2022

Une idée que nous avons eue était de créer un système séparé pour les simulations de modules de nœuds manuels, mais cela devrait probablement être discuté dans une proposition séparée, je vais donc clore ce problème.

Tous les 3 commentaires

Je pense que ce cas est similaire à ce qui se passe dans mon projet

Dans mon cas, j'ai <rootDir>/__mocks__/left-pad.js . Tous les tests qui importent left-pad importeront automatiquement le left-pad simulé même si je n'ai pas explicitement appelé jest.mock('left-pad')

Ma solution de contournement actuelle est explicitement simulée, puis explicitement démockée. C'est moche, mais ça marche

jest.mock('left-pad');
jest.unmock('left-pad');

Aha, merci ! C'est une solution de contournement plus propre que la mienne, mais toujours pas idéale !

Oui, les simulations manuelles ont priorité sur les modules de nœuds. Le système de simulations manuelles est un peu sommaire. Pour l'instant, nous supprimons l'avertissement dans la prochaine version, donc jest.unmock('left-pad') devrait être tout ce dont vous avez besoin. Voir #2022

Une idée que nous avons eue était de créer un système séparé pour les simulations de modules de nœuds manuels, mais cela devrait probablement être discuté dans une proposition séparée, je vais donc clore ce problème.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

Antho2407 picture Antho2407  ·  3Commentaires

kentor picture kentor  ·  3Commentaires

jardakotesovec picture jardakotesovec  ·  3Commentaires

paularmstrong picture paularmstrong  ·  3Commentaires

samzhang111 picture samzhang111  ·  3Commentaires