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
.
npm install
dependênciasnpm 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
}
}
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.
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 #2022Uma 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.