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
.
npm install
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
}
}
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.
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 #2022Une 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.