Jest: Módulos simulados são priorizados sobre node_modules

Criado em 13 out. 2016  ·  3Comentários  ·  Fonte: facebook/jest

Deseja solicitar um _recurso_ ou relatar um _bug_?
Reportar um erro.

Qual é o comportamento atual?
Se um projeto tem uma dependência de um módulo com o mesmo nome de um arquivo interno com um mock, essa implementação mock é recuperada para solicitações do módulo global, em vez do módulo global, exigindo unmocking explícito (que então imprime um aviso, apesar exibindo uma mudança tangível no comportamento).

Se o comportamento atual for um bug, forneça as etapas para reproduzir e, se possível, um repositório mínimo no GitHub que possamos npm install e npm test .

  1. Clone https://github.com/ticky/jest-mock-bug , npm install dependências
  2. Correr npm test

O teste que espera poder importar o módulo global ( with no explicit opt-out › globalPad should not be a mock function ) falha porque o módulo retornado é de fato o mock manual.

(Observe que left-pad é usado aqui, pois é um módulo pequeno sem requisitos de compilação.)

Qual é o comportamento esperado?

A instrução de importação deve retornar o módulo global, como faz em explicit-opt-out.js

Execute o Jest novamente com --debug e forneça a configuração completa que ele 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
  }
}

Comentários muito úteis

Sim, simulações manuais têm precedência sobre módulos de nó. O sistema de simulação manual é um pouco incompleto. Por enquanto, estamos removendo o aviso na próxima versão, então jest.unmock('left-pad') deve ser tudo o que você precisa. Veja #2022

Uma ideia que tivemos foi fazer um sistema separado para mocks de módulo de nó manual, mas isso provavelmente deve ser discutido em uma proposta separada, então vou encerrar este problema.

Todos 3 comentários

Acho que esse caso é parecido com o que acontece no meu projeto

No meu caso eu tenho <rootDir>/__mocks__/left-pad.js . Todos os testes que importam left-pad importarão automaticamente o left-pad simulado mesmo que eu não tenha chamado explicitamente jest.mock('left-pad')

Minha solução atual é explicitamente simulada e, em seguida, desmoronada explicitamente. É feio, mas funciona

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

Ah, obrigado! Essa é uma solução mais limpa do que a minha, embora definitivamente não seja a ideal!

Sim, simulações manuais têm precedência sobre módulos de nó. O sistema de simulação manual é um pouco incompleto. Por enquanto, estamos removendo o aviso na próxima versão, então jest.unmock('left-pad') deve ser tudo o que você precisa. Veja #2022

Uma ideia que tivemos foi fazer um sistema separado para mocks de módulo de nó manual, mas isso provavelmente deve ser discutido em uma proposta separada, então vou encerrar este problema.

Esta página foi útil?
0 / 5 - 0 avaliações