Estou começando a pensar que isso não é possível, mas quero perguntar de qualquer maneira.
Quero testar se um dos meus módulos ES6 chama outro módulo ES6 de uma maneira específica. Com Jasmine, isso é super fácil -
O código do aplicativo:
// myModule.js
import dependency from './dependency';
export default (x) => {
dependency.doSomething(x * 2);
}
E o código de teste:
//myModule-test.js
import myModule from '../myModule';
import dependency from '../dependency';
describe('myModule', () => {
it('calls the dependency with double the input', () => {
spyOn(dependency, 'doSomething');
myModule(2);
expect(dependency.doSomething).toHaveBeenCalledWith(4);
});
});
Qual é o equivalente com Jest? Eu sinto que isso é uma coisa tão simples de se querer fazer, mas eu tenho arrancado meu cabelo tentando descobrir isso.
O mais próximo que cheguei é substituindo os import
por require
s e movendo-os para dentro dos testes / funções. Nenhuma das coisas que eu quero fazer.
// myModule.js
export default (x) => {
const dependency = require('./dependency'); // yuck
dependency.doSomething(x * 2);
}
//myModule-test.js
describe('myModule', () => {
it('calls the dependency with double the input', () => {
jest.mock('../dependency');
myModule(2);
const dependency = require('../dependency'); // also yuck
expect(dependency.doSomething).toBeCalledWith(4);
});
});
Para pontos de bônus, eu adoraria fazer a coisa toda funcionar quando a função interna dependency.js
for uma exportação padrão. No entanto, eu sei que espionar as exportações padrão não funciona no Jasmine (ou pelo menos eu nunca consegui fazê-lo funcionar), então não tenho esperança de que seja possível no Jest também.
fonte
import
s pararequire
s por enquanto. Obrigado pelo alerta.Respostas:
Consegui resolver isso usando um hack envolvendo
import *
. Até funciona para exportações nomeadas e padrão!Para uma exportação nomeada:
Ou para uma exportação padrão:
Como Mihai Damian apontou corretamente, isso está mudando o objeto do módulo
dependency
e, portanto, 'vazará' para outros testes. Portanto, se você usar essa abordagem, armazene o valor original e volte a configurá-lo após cada teste. Para fazer isso facilmente com o Jest, use o método spyOn () em vez dejest.fn()
porque ele suporta facilmente a restauração de seu valor original, evitando assim o vazamento mencionado anteriormente.fonte
dependency
arquivo residir no mesmo arquivomyModule
, ele não funcionará.Você precisa zombar do módulo e definir o espião sozinho:
fonte
babel-plugin-jest-hoist: The second argument of jest.mock must be a function.
então o código nem está compilando.jest.mock
é relativo ao arquivo de teste.__esModule: true
ao objeto simulado. Esse é o sinalizador interno usado pelo código transpilado para determinar se é um módulo es6 transpilado ou um módulo commonjs.jest.mock('../dependency', () => ({ default: jest.fn() }))
Para simular uma exportação padrão do módulo de dependência ES6 usando o jest:
As outras opções não funcionaram no meu caso.
fonte
Adicionando mais à resposta de Andreas. Eu tive o mesmo problema com o código ES6, mas não queria alterar as importações. Isso parecia hacky. Então eu fiz isso
E adicionou dependency.js na pasta "__ zomba __" paralela ao dependency.js. Isso funcionou para mim. Além disso, isso me deu a opção de retornar dados adequados da implementação simulada. Certifique-se de fornecer o caminho correto para o módulo que você deseja zombar.
fonte
__mocks__/translations.js
arquivo simplesmente padrão exportaçõesjest.fn()
em algo como:export default jest.fn((id) => id)
jest.genMockFromModule
para gerar simulações a partir de módulos. facebook.github.io/jest/docs/…export default jest.genMockFromModule('../dependency')
terão todas as suas funções atribuídasdependency.default
após chamar `jest.mock ('.. dependency'), mas, caso contrário, se comportarão conforme o esperado.expect(???)
Avançando rapidamente para 2020, achei este link a solução. usando apenas a sintaxe do módulo ES6 https://remarkablemark.org/blog/2018/06/28/jest-mock-default-named-export/
Também uma coisa que você precisa saber (o que demorou um pouco para descobrir) é que você não pode chamar jest.mock () dentro do teste; você deve chamá-lo no nível superior do módulo. No entanto, você pode chamar mockImplementation () dentro de testes individuais se desejar configurar simulações diferentes para testes diferentes.
fonte
A pergunta já está respondida, mas você pode resolvê-la assim:
dependency.js
myModule.js:
myModule.spec.js:
fonte
Eu resolvi isso de outra maneira. Digamos que você tenha seu dependency.js
Eu crio um arquivo depdency.mock.js além dele com o seguinte conteúdo:
e no teste, antes de importar o arquivo que possui a impedância que eu uso:
fonte