Jest: Los módulos simulados tienen prioridad sobre node_modules

Creado en 13 oct. 2016  ·  3Comentarios  ·  Fuente: facebook/jest

¿Desea solicitar una _función_ o informar un _error_?
Reportar un error.

¿Cuál es el comportamiento actual?
Si un proyecto tiene una dependencia de un módulo con el mismo nombre que un archivo interno con un simulacro, esa implementación simulada se recupera para las solicitudes del módulo global, en lugar del módulo global, lo que requiere un desmoronamiento explícito (que luego imprime una advertencia, a pesar de mostrando un cambio tangible en el comportamiento).

Si el comportamiento actual es un error, proporcione los pasos para reproducir y, si es posible, un repositorio mínimo en GitHub que podamos npm install y npm test .

  1. Clonar https://github.com/ticky/jest-mock-bug , npm install dependencias
  2. Ejecutar npm test

La prueba que esperaba poder importar el módulo global ( with no explicit opt-out › globalPad should not be a mock function ) falla porque el módulo devuelto es, de hecho, el simulacro manual.

(Tenga en cuenta que aquí se usa left-pad ya que es un módulo pequeño sin requisitos de compilación).

¿Cuál es el comportamiento esperado?

La declaración de importación debe devolver el módulo global, como lo hace en explicit-opt-out.js

Ejecute Jest nuevamente con --debug y proporcione la configuración completa que 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
  }
}

Comentario más útil

Sí, los simulacros manuales tienen prioridad sobre los módulos de nodo. El sistema de simulacros manuales es un poco incompleto. Por ahora, eliminaremos la advertencia en la próxima versión, por lo que jest.unmock('left-pad') debería ser todo lo que necesita. Ver #2022

Una idea que tuvimos fue crear un sistema separado para simulacros de módulos de nodos manuales, pero eso probablemente debería discutirse en una propuesta separada, así que cerraré este problema.

Todos 3 comentarios

Creo que este caso es similar a lo que sucede en mi proyecto.

En mi caso tengo <rootDir>/__mocks__/left-pad.js . Todas las pruebas que importan left-pad importarán automáticamente el left-pad simulado aunque no llamé explícitamente a jest.mock('left-pad')

Mi solución actual es simulacros explícitos y luego dessimularlos explícitamente. Es feo, pero funciona.

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

¡Ajá, gracias! Esa es una solución más limpia que la mía, ¡aunque definitivamente no es la ideal!

Sí, los simulacros manuales tienen prioridad sobre los módulos de nodo. El sistema de simulacros manuales es un poco incompleto. Por ahora, eliminaremos la advertencia en la próxima versión, por lo que jest.unmock('left-pad') debería ser todo lo que necesita. Ver #2022

Una idea que tuvimos fue crear un sistema separado para simulacros de módulos de nodos manuales, pero eso probablemente debería discutirse en una propuesta separada, así que cerraré este problema.

¿Fue útil esta página
0 / 5 - 0 calificaciones