Jest: [bug] duplication manuelle de la maquette trouvée dans des répertoires séparés

CrĂ©Ă© le 9 nov. 2016  Â·  66Commentaires  Â·  Source: facebook/jest

Voulez-vous demander une fonctionnalité ou signaler un bogue ? Punaise

Quel est le comportement actuel?

Étant donnĂ© une arborescence de fichiers:

src/app/modules
├── module1
│   ├── index.js
│   ├── __tests__/
├── module2
│   ├── index.js
│   ├── __tests__/

J'utilise les modules en dehors du répertoire modules en les important par nom de répertoire:

import Module1 from '../modules/module1';
import Module2 from '../modules/module2';

J'aimerais pouvoir me moquer de module1 et module2 . Cependant, si je crée src/app/modules/module1/__mocks__/index.js et src/app/modules/module2/__mocks__/index.js , on me donne l'erreur duplicate manual mock found de jest-haste-map .

Si, cependant, j'essaye de créer src/app/modules/__mocks__/{module1.js,module2.js} , les fichiers simulés ne sont pas utilisés.

Si le comportement actuel est un bogue, veuillez fournir les étapes pour reproduire et si possible un dépÎt minimal sur GitHub que nous pouvons npm install et npm test .

Voir le comportement ci-dessus.

Quel est le comportement attendu?

Je m'attendrais à ce que l'une ou l'autre approche fonctionne, étant donné que le premier cas utilise des chemins différents et le second cas utilise le chemin d'accÚs du module.

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

nƓud v6.2.0
npm v3.8.9
OS X 10.11.6

> NODE_ENV=test jest --env jsdom "--debug" "src/app/redux/modules/devices"

jest version = 17.0.0
test framework = jasmine2
config = {
  "moduleFileExtensions": [
    "js",
    "json"
  ],
  "moduleDirectories": [
    "node_modules"
  ],
  "moduleNameMapper": [
    [
      "^.+\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$",
      "/Users/paul/dev/tools/jest/mock-assets.js"
    ],
    [
      "^.+\\.css$",
      "identity-obj-proxy"
    ]
  ],
  "name": "dev",
  "setupTestFrameworkScriptFile": "/Users/paul/dev/tools/jest/setup-framework.js",
  "testPathDirs": [
    "/Users/paul/dev/src"
  ],
  "testRegex": "/__tests__/.*\\.test\\.js$",
  "timers": "fake",
  "rootDir": "/Users/paul/dev",
  "setupFiles": [],
  "testRunner": "/Users/paul/dev/node_modules/jest-jasmine2/build/index.js",
  "testEnvironment": "/Users/paul/dev/node_modules/jest-environment-jsdom/build/index.js",
  "transform": [
    [
      "^.+\\.jsx?$",
      "/Users/paul/dev/node_modules/babel-jest/build/index.js"
    ]
  ],
  "usesBabelJest": true,
  "automock": false,
  "bail": false,
  "browser": false,
  "cacheDirectory": "/var/folders/dm/vt920lmd6tzdq_709zkykwx40000gn/T/jest",
  "coveragePathIgnorePatterns": [
    "/node_modules/"
  ],
  "coverageReporters": [
    "json",
    "text",
    "lcov",
    "clover"
  ],
  "expand": false,
  "globals": {},
  "haste": {
    "providesModuleNodeModules": []
  },
  "mocksPattern": "__mocks__",
  "modulePathIgnorePatterns": [],
  "noStackTrace": false,
  "notify": false,
  "preset": null,
  "resetMocks": false,
  "resetModules": false,
  "snapshotSerializers": [],
  "testPathIgnorePatterns": [
    "/node_modules/"
  ],
  "testURL": "about:blank",
  "transformIgnorePatterns": [
    "/node_modules/"
  ],
  "useStderr": false,
  "verbose": null,
  "watch": false,
  "cache": true,
  "watchman": true,
  "testcheckOptions": {
    "times": 100,
    "maxSize": 200
  }
}
jest-haste-map: duplicate manual mock found:
  Module name: index
  Duplicate Mock path: /Users/paul/dev/src/app/modules/push-notification-manager/__mocks__/index.js
This warning is caused by two manual mock files with the same file name.
Jest will use the mock file found in:
/Users/paul/dev/src/app/modules/push-notification-manager/__mocks__/index.js
 Please delete one of the following two files:
 /Users/paul/dev/src/app/modules/image-file/__mocks__/index.js
/Users/paul/dev/src/app/modules/push-notification-manager/__mocks__/index.js


No tests found
  1 file checked.
  testPathDirs: /Users/paul/dev/src - 1 match
  testRegex: /__tests__/.*\.test\.js$ - 0 matches
  testPathIgnorePatterns: /node_modules/ - 1 match
Enhancement Confirmed Help Wanted

Commentaire le plus utile

Cela semble fonctionner pour moi. dans jest.config.js:

module.exports = {
  // ...
  modulePathIgnorePatterns: ["<rootDir>/.*/__mocks__"]
};

Je ne suis pas sûr de la portée ou de l'impact de ce changement, car j'ai un petit projet.

Tous les 66 commentaires

+1

Dans mon cas, aprÚs avoir effacé les cacheDirectory / var / folders / dm / vt920lmd6tzdq_709zkykwx40000gn / T / jest et réinstaller les dépendances npm, ces messages ont disparu.

Voici le code incriminé:

https://github.com/facebook/jest/blob/cd8976ec50dbed79cfe07f275052cdd80d466e73/packages/jest-haste-map/src/index.js#L98

Mais il semble que le comportement puisse ĂȘtre explicitement souhaitĂ© car un test le confirme:

https://github.com/facebook/jest/blob/8de90b320c87a0a36d68f6bd8177620a985df269/packages/jest-haste-map/src/__tests__/__snapshots__/index-test.js.snap#L15

Qui a été ajouté dans:

https://github.com/facebook/jest/commit/cfade282fbbe2737b6dd2cee1cf3da3ee8624512

Je me demande pourquoi nous utilisons basename plutÎt que le chemin complet comme clé?

/ cc @flarnie

Cela signifie que les basename s pour les modules doivent ĂȘtre globalement uniques dans un projet lors de l'utilisation de simulations manuelles. Pour mon cas d'utilisation, cela signifie que je ne peux pas faire quelque chose comme:

import { MyWhatever } from 'models/MyWhatever/schema';
import { MyOtherWhatever } from 'models/MyOtherWhatever/schema';

et utilisez des simulations manuelles en mĂȘme temps. Jest les verra actuellement tous les deux se moquer de schema et se plaindra.

Bien que la solution de contournement soit triviale (s / schema / MyWhateverSchema /), cela ressemble Ă  un bogue pour renommer et restructurer le code non-test pour rendre la plaisanterie heureuse

Oui, c'est vraiment nul. Le systÚme de moquage manuel n'est vraiment pas bon et je suis heureux d'accepter les PR qui amélioreront la situation, en supposant que nous puissions nous assurer de ne pas casser tout FB (mais je peux m'en occuper :))

Cool. Je trouverai peut-ĂȘtre du temps demain pour prĂ©parer un patch, mais pas de promesses 😅

@cpojer y a-t-il une raison particuliĂšre Ă  ce comportement ?

Cela pourrait-il avoir quelque chose Ă  voir avec le fait que fb utilise des noms de fichiers uniques pour les modules? Je ne vois pas autrement comment ne pas autoriser deux simulacres avec le mĂȘme nom a du sens ...

Oui, les simulacres sont Ă©galement «globaux». C'est une conception terrible avec laquelle nous devons vivre, malheureusement. Chez FB, nous avons plus de 4000 fichiers simulĂ©s au mauvais endroit (et souvent, il n'y a mĂȘme pas un emplacement appropriĂ©). Il est probable que nous rĂ©glerons ce problĂšme au dĂ©but de la prochaine moitiĂ©, donc cela devrait s'amĂ©liorer dans Jest. Je suis heureux de soutenir les PR qui amĂ©liorent le comportement de Jest pour l'open source - si nous pouvons conserver l'ancien comportement de Jest chez FB pour le moment.

@cpojer et un drapeau? Accepteriez-vous un pr qui active / désactive cela avec un drapeau?

Ouais, ça devrait ĂȘtre une option de configuration. Mais je ne parle pas seulement de l'avertissement, je parle aussi de la fonctionnalitĂ© en gĂ©nĂ©ral.

@cpojer Ă  droite - quelles parties de la plaisanterie cela touche-t-il?

Le code de résolution est appelé à partir de jest-runtime: https://github.com/facebook/jest/blob/master/packages/jest-runtime/src/index.js et est quelque part dans jest-resolution et jest-resolution-dependencies .

@cpojer merci pour les pointeurs: +1:

@cpojer qu'en est-il d'un remplacement global, comme JEST_USE_BASENAME_FOR_CACHING , pour changer ce comportement?

Au moins, nous pouvons profiter de noms de fichiers non uniques, et cela ne cassera rien dans FB.

Bien sûr, c'est une solution temporaire.

Je veux dire, c'est dans quelque /etc/profile ou ~/.bashrc

export JEST_USE_BASENAME_FOR_CACHING="true"

(ou un fichier avec env)
et alors

$ jest

ou celui-ci, sans modifications du fichier env:

$ JEST_USE_BASENAME_FOR_CACHING="true" jest

Ce que tu penses? C'est une sorte de hack ou c'est ok? :clin d'Ɠil:

Je viens d'essayer avec un nouveau dépÎt , en utilisant deux versions de jest ( ^15.0.0 et ^17.0.0 ) et, bien que ce dernier donne l'avertissement, le test se comporte comme prévu.

@ColCh Je ne pense pas que le problĂšme ici soit avec le cache, probablement un nom plus appropriĂ© pourrait ĂȘtre JEST_USE_BASENAME_FOR_MOCKING .

@cpojer si le code FB a la restriction sur l'unicité des noms, l'utilisation du chemin complet comme clé pour la carte des mocks ne devrait pas poser de problÚmes.

Ai-je raison ou il y a quelque chose que je ne vois pas?

Les deux solutions que je vois sont:

  • modifier getMockName pour accepter l'option d'utiliser le nom de base ou le chemin complet
  • supprimer complĂštement cette fonction

ce serait bien de voir @cpojer répondre là-dessus

Salut tout le monde, désolé pour le retard, je suis plutÎt sauvegardé avec une tonne de trucs en ce moment.

Je pense que je vais bien si vous décidez de faire tout changement de rupture dans Jest qui est nécessaire pour améliorer ce systÚme. La moquerie manuelle est vraiment gùchée et ne fonctionne pas bien. Une chose que nous voulons faire est de limiter la portée des "modules de précipitation" (systÚme de module FB interne) en utilisant une option de configuration, comme "haste_modules": ['path/a', 'path/b']" , puis de ne regarder que les modules de précipitation dans ces dossiers, y compris cette moquerie étrange comportement. Si quelqu'un veut faire ce changement, ce serait incroyable.

Une chose à comprendre est alors la suivante: si toutes les simulations manuelles sont locales, comme __mocks__/a.js mappe à a.js , que faisons-nous avec les simulations node_module? Pour cela, il existe plusieurs façons:

  • Introduisez un nouveau dossier __node_modules_mocks__ mais c'est moche.
  • Le dossier de niveau supĂ©rieur __mocks__ vu de rootDir (racine du projet) pourrait agir comme un dossier global.

Donc pour résumer:

  • Corrigeons les simulations manuelles dans Jest!
  • Laissons les modules de hĂąte aux espaces de noms et limitons-les Ă  certains dossiers / regex.
  • Assurez-vous que le comportement moqueur actuel fonctionne toujours pour FB, mĂȘme si cela signifie que nous devons mettre certains dossiers sur liste blanche pour accĂ©lĂ©rer le travail (cela ressemblerait simplement Ă  ["<rootDir>"] pour nous pour le moment, je suppose)
  • DĂ©couvrez comment toujours pouvoir simuler des modules de nƓuds.

Qu'est-ce que tu penses?

En ordre:

  • Corrigeons les simulations manuelles dans Jest!

HURRAY: sourire:: tada:

  • Laissons les modules de hĂąte aux espaces de noms et limitons-les Ă  certains dossiers / regex.
  • Assurez-vous que le comportement moqueur actuel fonctionne toujours pour FB, mĂȘme si cela signifie que nous devons ajouter certains dossiers Ă  la liste blanche pour accĂ©lĂ©rer le travail (cela ressemblerait simplement Ă  [""] pour nous pour l'instant, je suppose)

Je ne suis pas sûr de comprendre les besoins à la hùte.
Que voulez-vous dire, c'est donner la possibilité de dire "ces modules sont des modules de précipitation"?
Si nous avons quatre modules: /path_1/a , /path_1/b , /path_2/a , /path_2/c , et le paramĂštre est

"haste_modules:" ["/path_1/a", "/path_2/c"]

seuls /path_1/a et /path_1/b sont limités pour exister uniquement dans /path_1 , donc /path_2/c est valide et /path_2/a génÚre une erreur / un avertissement.

Je dirais que les cibles peuvent facilement ĂȘtre des fichiers spĂ©cifiques et des rĂ©pertoires entiers, mĂȘme avec un simple / double * .

  • DĂ©couvrez comment toujours pouvoir simuler des modules de nƓuds.

Je maintiendrais le comportement actuel :

Si le module dont vous vous moquez est un module de nƓud (par exemple: fs), la maquette doit ĂȘtre placĂ©e dans le mĂȘme rĂ©pertoire parent que le dossier node_modules.

Mes pensées:

modules de hĂąte:

Je pense que haste_modules est sympa, il convient exactement comme collectCoverageFrom et d'autres options: tableau de globs
Dans le cas, si vous avez tous les src comme modules _haste_, et qu'un seul répertoire n'est pas hùte:

haste_modules: [
  "src",
  "!src/foo"
]

node_modules

@EnoahNetzach et si quelqu'un avait les mĂȘmes noms pour le module d'application et le module de node_modules?


Pour le faire fonctionner sans hĂąte ... hm, je pense que cela peut ĂȘtre dĂ©crit comme:

module de nƓud donnĂ© project/node_modules/react , la simulation sera Ă  l'intĂ©rieur de project/__node_modules_mocks__/react.js
si vous avez un fichier project/react.js , utilisez project/__mocks__/react.js

(bien sĂ»r, react.js est un exemple. Ici peut ĂȘtre n'importe quel nom de fichier parmi tous les modules, qui peuvent ĂȘtre installĂ©s Ă  partir de npm )

Vraiment, la moquerie du module node_modules ?

Quelqu'un se moque- t-il souvent des modules à l'intérieur de

que penser de plus

comme je l'ai remarqué, pour les projets réaction , nous devons souvent nous moquer de application modules et laisser les modules de node_modules débloqués (par exemple lodash )

cela signifie que nous avons:

  • composant fictif crĂ©Ă© manuellement pour chaque composant muet (les composants muets sont des composants de mise en page)
  • une longue liste d'appels jest.mock dans chaque fichier de test

__ce que je veux dire__: ce serait trÚs bien d'avoir la possibilité de _auto mock_ des modules sur certains chemins.

Il peut ĂȘtre implĂ©mentĂ© autour de la structure de donnĂ©es bien connue array-of-jest-globs dans config, et des modules de filtrage dessus.

Je décrirai cela étape par étape

Compte tenu de cette entrée de configuration

"autoMockingPaths": [
  "src/components/dumb/**/*.js",
]

et ce code Ă  src/screens/app.js :

import _ from 'lodash';
import Button from '../../components/dumb/button.js';

// blah blah AppScreen implementation skipped

et ce code de test pour Ă©cran Ă  src/screens/__tests__/app-test.js :

import AppScreen from '../app.js';

describe('AppScreen', () => /* testing app screen */);

Nous arrivons Ă  cette situation, dans le contexte de app-test.js :

  • AppScreen n'est pas moquĂ©
  • lodash n'est pas moquĂ©
  • Button , qui est requis par AppScreen , est moquĂ©

... Vous pouvez répondre, comment il jouera avec l'entrée de configuration automock ?

dire simplement, automock: true Ă©quivaut Ă :

"autoMockingPaths": [
  "<rootDir>"
]

moquerie automatique ... attendez!

peut-ĂȘtre simplement introduire une valeur spĂ©ciale pour automock ? au moins ça ne cassera pas les configs des gens

par exemple, avec cette entrée de configuration:

automock: "app"

jest se moquera automatiquement de tous les modules d'application et laissera les versions réelles des modules à partir de node_modules

que pensez-vous du verrouillage automatique des modules au niveau de l'application, @cpojer ? Je trouve cela trĂšs efficace pour mon cas particulier.

Je suis entiĂšrement d'accord avec "haste_modules" .

Personnellement, nous n'utilisons pas beaucoup le verrouillage automatique, donc je ne peux pas dire ce qui est mieux, je suppose que le var "autoMockingPaths" pourrait ĂȘtre utile et suffisamment Ă©lastique.
Au contraire , je trouve "automock": "app" trop raide (plaisanterie automocking déjà désactivé par défaut).

Le __node_modules_mocks__ pourrait ĂȘtre une option, je suis d'accord que la raretĂ© compense la laideur (dans mon cas particulier, nous nous moquons rarement de node_modules , et quand nous devons le faire, nous utilisons jest.mock(...) ).
La seule mise en garde est: que se passe-t-il lorsque vous avez un dossier node_modules imbriqué (par exemple src/node_modules ), devez-vous vous moquer de ses modules du global __node_modules_mocks__ , une version imbriquée de ou normalement avec __mocks__ co-localisé?

peut ĂȘtre simplement jetĂ©, si quelqu'un a le mĂȘme nom de module dans node_modules et app modules

par exemple

app/express.js comme module d'application (peut-ĂȘtre que je fais un jeu de train)
et app/node_modules/express comme serveur Web Ă  partir de npm
throw new Error("can't mock express.js file - it duplicates one from node_modules")

dans ce cas, __mocks__ peut ĂȘtre utilisĂ© pour node_modules , mais les dĂ©veloppeurs doivent renommer leurs propres modules sur de telles collisions

non ... c'est plus moche que __node_modules_mocks__ , n'est-ce pas?

Ce que je voulais dire, c'est: que se passe-t-il si vous avez un module npm install ed x et plus tard, plus profondément dans votre base de code définir un module x dans un dossier node_modules imbriqué ?

La collision de dĂ©nomination est gĂ©nĂ©ralement gĂ©rĂ©e dans le nƓud en prĂ©fĂ©rant le plus proche, mais je ne sais pas comment cela fonctionne Ă  la hĂąte.

J'en parle parce que des projets comme Create React App l' utilisent ou le feront dans un proche avenir.

Sur une note de cÎté, @cpojer est cette question liée en quelque sorte?

Gardons cela concentrĂ© sur le changement du fonctionnement de la hĂąte (liste blanche / liste noire plutĂŽt que activĂ©e par dĂ©faut). Je pense que je prĂ©fĂ©rerais maintenir que <rootDir>/__mocks__ devrait ĂȘtre la valeur par dĂ©faut pour les simulations de modules de nƓuds. Nous pourrions Ă©galement en faire une option de configuration: "globalMocks" qui vaut par dĂ©faut <rootDir>/__mocks__ . Quelqu'un est-il prĂȘt Ă  travailler lĂ -dessus?

Je devrais pouvoir y travailler au plus tĂŽt le week-end prochain.

Je peux travailler sur les relations publiques ce dimanche, je suis un peu libre

@cpojer juste pour récapituler - créez globalMocks entrée de configuration <rootDir>/__mocks__ . Cette option régule l'utilisation de node-haste dans jest en spécifiant path? Ou ce sera un tableau de chemins?

Je pense que ce sont des changements plus importants sur la maniĂšre de rĂ©soudre ce problĂšme, mais je pense que nous avons besoin Ă  la fois de l'option singuliĂšre globalMocks (qui peut ĂȘtre une chaĂźne ou un tableau de chaĂźnes) et de l'option hasteModules qui serait un tableau de chemins de modules hĂąte. La plupart de ce code vit dans jest-haste-map et jest-resolution. Je ne sais pas encore Ă  100% Ă  quoi ressemblera la bonne solution.


De: Max Sysoev [email protected]
Envoyé: vendredi 9 décembre 2016 08:18:44
À: facebook / jest
Cc: Christoph Pojer; Mention
Sujet: Re: [facebook / jest] [bug] duplicate manuel simulé trouvé dans des répertoires séparés (# 2070)

Je peux travailler sur les relations publiques ce dimanche, je suis un peu libre

@cpojer https://github.com/cpojer juste pour récapituler - créez une entrée de configuration globalMocks avec la valeur par défaut de/ __ se moque__. Cette option régule l'utilisation de node-haste dans jest en spécifiant path? Ou ce sera un tableau de chemins?

-
Vous recevez cela parce que vous avez été mentionné.
Répondez directement à cet e-mail, affichez-le sur GitHub https://github.com/facebook/jest/issues/2070#issuecomment-265958606 , ou désactivez le fil https://github.com/notifications/unsubscribe-auth/AAA0KAMFc34iKqBDLHZzgaGHqycJ3WkAzk2

DĂ©solĂ©, mon poste de travail est devenu cassĂ©, et apparemment aucun moyen de le faire fonctionner dans quelques mois (1-2 mois). J'ai mĂȘme perdu mon projet sur ce PR: (Alors, dĂ©solĂ© d'avoir pris des responsabilitĂ©s.

Qu'en est-il juste une option de configuration pour changer le comportement de getMockName ?

Pas trop familier avec les éléments internes de jest, mais il semble que ce soit la solution la plus simple pour résoudre le problÚme sans casser la plaisanterie pour FB.

Cela va ĂȘtre plus compliquĂ© que je ne le pensais au dĂ©part. Pour moi, les simulations manuelles devraient Ă©galement remplacer le fichier dont elles sont les plus proches, Ă  savoir. quelque chose comme ça:

{ 'aws-sdk': '/Users/project/__mocks__/aws-sdk.js',
  'slack': '/Users/project/__mocks__/slack.js',
  '/Users/project/db/index': '/Users/project/db/__mocks__/index.js',
  '/Users/project/slack/index': '/Users/projects/slack/__mocks__/index.js' }

require('aws-sdk') devrait se résoudre en /Users/project/__mocks__/aws-sdk.js c'est une simulation pour un node_module .

require('./db') (ou tout chemin vers db ) devrait se résoudre en: /Users/project/db/__mocks__/index.js .

Ma comprĂ©hension de la façon de configurer les simulations manuelles jest (et il devrait probablement y avoir plus de documentation si quelque chose comme ce qui prĂ©cĂšde est utilisĂ©) Ă©tait qu'ils devraient ĂȘtre aussi proches que possible du fichier simulĂ© dans un rĂ©pertoire __mocks__ .

Les simulations manuelles sont définies en écrivant un module dans un sous-répertoire __mocks __ / immédiatement adjacent au module. (https://facebook.github.io/jest/docs/manual-mocks.html)

Compte tenu de cela, le comportement ci-dessus est le plus logique pour moi.

Pensées?

Ceci est une premiÚre étape pour implémenter quelque chose comme ce qui précÚde: https://github.com/facebook/jest/compare/master...mhahn : issue-2070-new-mock-resolution

Il casse la majorité des tests unitaires de plaisanterie car il ne permet plus de pures simulations «nommées» comme celles-ci: https://github.com/facebook/jest/blob/master/packages/jest-runtime/src/__mocks__/ createRuntime.js

IMO, quelque chose comme createRuntime est un utilitaire de test qui devrait ĂȘtre dans un dossier de test utils et importĂ© dans les tests qui en ont besoin. La façon dont il est implĂ©mentĂ© en tant que maquette manuelle n'a pas vraiment de sens pour moi comme quelque chose qui devrait ĂȘtre prĂ©servĂ©.

Une option consiste Ă  ajouter une variable de configuration qui basculera entre le comportement existant et la version nettoyĂ©e des modifications ci-dessus. Je ne sais pas vraiment comment cela devrait ĂȘtre appelĂ©.

Nous ne pouvons pas casser le comportement actuel car nous nous en appuyons extrĂȘmement sur Facebook.

@cpojer je suis d'accord. Je n'ai pas vraiment compris ce commentaire aprĂšs avoir lu le code: https://github.com/facebook/jest/issues/2070#issuecomment -265027510. peut-ĂȘtre pourrions-nous soutenir la liste blanche d'une liste de rĂ©pertoires qui rĂ©soudront le comportement actuel?

qu'en est-il de deux nouvelles options de configuration:

  • fullPathMockResolution (par dĂ©faut Ă  false pour conserver le comportement existant)
    associé à:
  • namedMockDirectories : si fullPathMockResolution est activĂ©, tous les rĂ©pertoires de ce tableau seront rĂ©solus avec le comportement existant. Pour le cas d'utilisation FB, ce serait juste [<rootDir>] comme vous l'avez mentionnĂ© ci-dessus.

Cela permet aux développeurs d'opter pour la résolution de chemin complet afin qu'elle ne nécessite pas de modifications par les installations jest existantes et active également le comportement existant pour des répertoires spécifiques s'ils le souhaitent.

cc @voideanvalue vous devrez peut-ĂȘtre penser Ă  cela (le manuel de l'espace de noms se moque dans le cadre de la nouvelle implĂ©mentation hĂąte).

+1, y a-t-il un moyen de résoudre ce problÚme?

+1

Des mises à jour sur la façon de résoudre ce problÚme? Cela s'avÚre vraiment douloureux si vous suivez une structure comme celle-ci:

project/
├── models
│   ├── index.js
│   ├── __mocks__/
│   │   ├── index.js/
├── challenges
│   ├── index.js
│   ├── __mocks__/
│   │   ├── index.js/

À l'heure actuelle, je dois moquer manuellement un module dans le test si j'en utilise deux avec un nom `` en conflit '' mĂȘme s'ils n'ont en fait pas de noms en conflit, car le chemin doit ĂȘtre pris en compte.

À votre santĂ©,
Dominik

@cpojer Des mises Ă  jour ici les gars? Y at-il un travail autour?

Une petite solution de contournement pour moi est de se moquer des modules avec require

jest.mock('models/index', () => require('models/index/_mocks_/index'));

J'ai renommé le nom du dossier __mocks__ en _mocks_ pour que la plaisanterie n'attrape pas les fichiers.

Un jour oĂč cela fonctionnera, je renommerai _mocks_ en __mocks__ et supprimerai la partie requise de jest.mock

PremiĂšrement: merci pour tout le travail formidable.
DeuxiĂšmement: c'est vraiment trĂšs frustrant. Je me retrouve obligĂ© d'utiliser jest.mock dans le fichier de test lorsque le fichier fictif partage un nom avec tout autre fichier dans l'ensemble de la base de code qui est Ă©galement moquĂ©. Le levage interdit Ă©galement l'importation de la maquette rĂ©elle, ce qui vous oblige Ă  dupliquer la maquette dans deux tests qui nĂ©cessitent que ce fichier soit simulĂ©, ce qui ajoute Ă  la fragilitĂ© de la suite de tests. Cherchons-nous Ă  rĂ©soudre ce problĂšme? Est-ce que FB utilise ce truc? Si oui, alors comment? 😞

+1 trĂšs frustrant de voir ces avertissements. J'ai hĂąte de trouver une solution.

Je pense que le problÚme que j'ai est lié:

si j'ai un jest.mock ('src / utils / history'), il se moque Ă©galement incorrectement du node_module 'history'.

https://github.com/cwmoo740/jest-manual-mocks-node-modules

Les gars une mise Ă  jour?

@masoudcs Je pense que cela a

package.json

"jest": {
  /* other settings ... */
  "modulePathIgnorePatterns": ["<rootDir>/node_modules/react-native/Libraries/Core/__mocks__"]
}

Ajoutez les dossiers "duplicate" dans le tableau modulePathIgnorePatterns et l'avertissement disparaĂźtra

Merci @brunolm

C'est donc juste un avertissement, n'est-ce pas?!
Je veux juste m'assurer que cela ne provoquerait pas quelque chose de mauvais, c'est-à-dire se moquer de index.js dans plusieurs répertoires:
src/app/modules/module1/__mocks__/index.js et src/app/modules/module2/__mocks__/index.js

Je ne sais pas si cela compte, mais quand je courais, il disait qu'il ne choisirait que l'autre et que ce que j'ai énuméré serait ignoré de toute façon.

Je pense donc que c'est bien de lui dire d'ignorer, il ne l'utilisait pas de toute façon.

Oui, comme vous l'avez dit, et nous n'avons rencontré aucun problÚme jusqu'à présent.
Espérons qu'il fait ce qu'il a à faire! :)
Merci

J'ai essayé ce que ces deux derniers commits suggéraient mais je n'ai pas supprimé l'avertissement.

jest.mock('dir/index', () => require('dir/__mocks_/index'));

Je vois cet avertissement car j'utilise GitBook (rĂ©pertoire ./_book ), mĂȘme si j'ai testPathIgnorePatterns: ['/_book/', ...otherStuff] dans ma configuration. En parcourant ce problĂšme, je ne vois pas de solution de contournement claire. Je veux juste arrĂȘter de voir les avertissements - toute aide serait apprĂ©ciĂ©e.

+1

Une mise Ă  jour pour ceci?

Toujours Ă  la recherche d'un correctif pour que mes fichiers de test puissent ĂȘtre importĂ©s de maniĂšre rĂ©guliĂšre, sans utiliser la mĂ©thode la plus sale qui a Ă©tĂ© suggĂ©rĂ©e ci-dessus.

jest.mock('models/index', () => require('models/index/_mocks_/index'));

Notre structure de répertoires ressemble à celle de @dkundel référencée ici https://github.com/facebook/jest/issues/2070#issuecomment -301332202 avec les modÚles et les composants dans leurs propres espaces de noms avec index.js étant la valeur par défaut exportation.

PréfÚre ne pas faire taire les avertissements ou jeter tous les faux dans un répertoire plat. Certains de nos simulacres sont profondément imbriqués et la solution de contournement suggérée ressemblerait probablement à
jest.mock('pages/index/components/Component', () => require('pages/index/components/Component/_mocks_/index'));
dans notre structure.

N'importe quel mot?

@karomancer J'ai soumis le PR # 6037 qui vous permettra d'utiliser une configuration pour supprimer les avertissements. Pour l'instant, il n'a pas été fusionné; J'attends une réponse des contributeurs.

Ce problÚme est trÚs frustrant, mais je pense avoir trouvé une bonne solution de contournement qui aboutit à une convention de dénomination plus claire.

En package.json

{
  "jest": {
    "setupFiles": [
      "<rootDir>/test.mocks.ts"
    ]
  }
}
/* test.mocks.ts */

// modules mocked before every test
// use `jest.unmock(...)` to undo for any single test case
const mockedModules = [
    "./path/to/module1/index.ts",
    "./path/to/module2/index.ts",
];

mockedModules.forEach((path) => {
    const mockPath = path.replace(/\.ts$/g, ".mock.ts");
    jest.mock(path, () => require(mockPath));
});

Cela vous permettra de moquez anything.ts en créant un sibling anything.mock.ts et en ajoutant le chemin de l'original dans le haut niveau test.mocks s » mockedModules tableau.

Pourquoi ce problÚme est-il identifié comme une amélioration?

Cela semble fonctionner pour moi. dans jest.config.js:

module.exports = {
  // ...
  modulePathIgnorePatterns: ["<rootDir>/.*/__mocks__"]
};

Je ne suis pas sûr de la portée ou de l'impact de ce changement, car j'ai un petit projet.

@amccloud merci! Cela a résolu mon problÚme! Détails ci-dessous.

J'ai un module helpers dans le répertoire racine de mon projet. L'assistant exporte la fonction parseNodeFromString .
J'ai créé dans un autre module le fichier local helpers . Puis je me suis moqué de lui pour l'un de mes tests. Et tous les tests utilisant la fonction parseNodeFromString commencé à échouer avec l'erreur suivante:

FAIL  src/some_dir/bla/tests/SomeClass.test.js
  ● Test suite failed to run

    TypeError: (0 , _helpers.parseNodeFromString) is not a function

Et ce problĂšme? On dirait que la solution

modulePathIgnorePatterns: ["<rootDir>/.*/__mocks__"]

Cette solution fonctionne bien qu'elle ait fait Ă©chouer mes simulations de haut niveau pour les modules de nƓuds. Je l'ai donc changĂ© pour ne pas ignorer mon dossier racine __mock__ avec: "modulePathIgnorePatterns": ["<rootDir>/src/react/.*/__mocks__"], . Pourtant, il est assez Ă©trange que les simulacres ne soient pas seulement uniques en fonction du chemin complet depuis la racine. Il est assez courant d'avoir: users/helper.js & posts/helper.js . L'avertissement prend assez de place et je ne veux pas cacher complĂštement les avertissements rĂ©els.

Alors, quel est le statut actuel des relations publiques? Existe-t-il une solution appropriée ou juste quelques hacks?

Dans mon cas, le module fictif a été copié dans le répertoire Dist à chaque build.

On dirait que c'est un problÚme avec le typographie incapable d'exclure les chemins / modÚles appartenant à une structure de répertoire plus profonde. C'est toujours un problÚme avec "typescript@^3.4.5".

Pour résoudre ce problÚme, j'ai commencé à nettoyer mon répertoire Dist avec "rimraf dist" avant chaque test.

"test:unit": "npm run clean && stencil test --spec --snapshot",

Je sais que c'est un hack, mais ça marche.

HĂ©, j'ai rĂ©solu ce problĂšme, voici ce qui s'est passĂ©, et peut-ĂȘtre que cela peut vous aider Ă  dupliquer cela.

trois solutions ou scénarios:

1, je modifiais deux fois mon application sur mon Ă©diteur de texte, ce qui signifie que j'exĂ©cutais l'installation / la mise Ă  jour du pod et le run-ios natif de rĂ©action Ă  partir de deux fenĂȘtres diffĂ©rentes. et j'ai eu cette erreur, j'ai essayĂ© de rechercher les fichiers en double dans Xcode et sur mon application mais je n'en ai trouvĂ© aucun. J'ai donc simplement supprimĂ© l'application du simulateur et relancĂ© react-native run-ios et cela a fonctionnĂ©.Il s'est avĂ©rĂ© que deux node_modules avaient Ă©tĂ© dupliquĂ©s en tant que tels: node_modules et node_modules0 dans mon fichier scr.

2, parfois lorsque j'appuie sur des touches alĂ©atoires sur mon mac, les node_modules sont dupliquĂ©s par exemple dans le dossier SRC, donc c'est Ă©galement le cas, il est donc logique de jeter un Ɠil Ă  vos dossiers pour toute duplication de node_modules.

3, je ne pouvais pas dĂ©marrer mon application tant que je n'avais pas lancĂ© et arrĂȘtĂ© une application diffĂ©rente sur le mĂȘme simulateur, puis j'ai redĂ©marrĂ© l'application avec la duplication qui s'est ensuite dĂ©clenchĂ©e sans aucune erreur.

Toujours rien? Impossible d'utiliser modulePathIgnorePatterns dans CRA

3 ans et 10 mois

Alternativement, ce serait bien si nous pouvions forcer Jest à générer une erreur lorsque ce problÚme survient, plutÎt qu'un simple avertissement. Les avertissements sont facilement ignorés; sur mon projet, je préférerais qu'une erreur soit levée, donc le développeur qui l'a introduit doit s'en occuper.

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