Troubleshooting
Hã, algo deu errado? Use este guia para resolver problemas com Jest.
Testes estão falhando e você não sabe por que #
Tente usar o suporte à depuração embutido no Node.
Nota: Suporte de depuração com Jest suporta apenas
node debug
; ele ainda suportanode inspect
devido a um problema de "upstream" em nodejs/node#7583. Até que o problema do "upstream" seja resolvido, depuração com Node não está disponível ao usar o Node v8. x. Para mais detalhes, consulte facebook/jest#1652.
Coloque uma instrução debugger;
em qualquer um dos seus testes e em seguida, no diretório do seu projeto, execute:
node --debug-brk ./node_modules/.bin/jest --runInBand [any other arguments here] or on Windows node --debug-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]
Isso executará Jest em um processo Node que um depurador externo pode se conectar. Observe que o processo vai pausar até que o depurador tenha conectado à ele.
Por exemplo, para conectar o depurador Node Inspector ao processo pausado, você iria primeiro instalá-lo (se você ainda não tiver ele instalado):
npm install --global node-inspector
Então simplesmente execute:
node-inspector
Isto resultará em um link que você pode abrir no Chrome. Depois de abrir esse link, será exibido Chrome Developer Tools, e um ponto de interrupção será definido na primeira linha do script CLI Jest (isto é feito simplesmente para dar tempo para você abrir as ferramentas de desenvolvedor e impedir a execução de Jest antes que você consiga fazer isso). Clique no botão que se parece com um botão "play" no lado superior direito da tela para continuar a execução. Quando Jest executa o teste que contém a instrução debugger
, a execução fará uma pausa e você pode examinar o escopo atual e a pilha de chamada.
Nota: a opção cli
--runInBand
certifica-se de que Jest executa testes no mesmo processo, ao invés de produzir processos para testes individuais. Normalmente Jest paraleliza execução de testes através de processos, mas é difícil de depurar vários processos ao mesmo tempo.
Mais informações sobre depuração do Node podem ser encontradas aqui.
Problemas de Cache #
O script de transformação foi alterado ou babel foi atualizado e as mudanças não estão sendo reconhecidas por Jest?
Tente novamente com --no-cache
. Jest armazena em cache os arquivos de módulo transformados para acelerar a execução de testes. Se você estiver usando seu próprio transformador personalizado, considere adicionar uma função getCacheKey
a ele: getCacheKey em Relay.
Promessas não resolvidas #
Se uma promessa não é resolvida de forma alguma, esse erro pode ser lançado:
- Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.`
Mais comumente, isso é causado por implementações conflitantes de Promessa. Considere substituir a implementação global de promessa com a sua própria, por exemplo global.Promise = require.requireActual('promise');
e/ou consolide as bibliotecas de Promessa usadas para uma única.
Se seu teste for um que leva muito tempo para executar, você pode querer considerar aumentar o tempo limite chamando jest.setTimeout
jest.setTimeout(10000); // 10 segundos de timeout
Problemas com Watchman #
Tente executar Jest com --no-watchman
ou definir a opção de configuração watchman
para false
.
Também consulte solucionando problemas do watchman.
Testes são extremamente lentos no Docker e/ou servidor de Integração Contínua (CI, Continuous Integration). #
Embora Jest é na maioria das vezes extremamente rápido em computadores multi-core modernos com rápidos SSDs, pode ser lento em certas configurações como nossos usuários tem descoberto.
Baseado nestas descobertas, uma maneira de atenuar este problema e melhorar a velocidade em até 50% é por executar testes sequencialmente.
Para isso, você pode executar testes na mesma "thread" usando --runInBand
:
# Using Jest CLI jest --runInBand # Using npm test (e.g. with create-react-app) npm test -- --runInBand
Uma outra alternativa para acelerar o tempo de execução de teste em servidores de integração contínua (CI) como Travis-CI é definir o "pool" de trabalho máximo para ~4. Especificamente no Travis-CI, isto pode reduzir o tempo de execução de teste pela metade. Nota: O plano gratuito de Travis CI disponível para projetos de código aberto inclui apenas 2 núcleos de CPU.
# Using Jest CLI jest --maxWorkers=4 # Using npm test (e.g. with create-react-app) npm test -- --maxWorkers=4
Testes são lentos quando depedem de automocking #
Se através da configuração automock: true
ou várias chamadas jest.mock('my-module')
em testes, automocking tem um custo de desempenho que pode se somar em grandes projetos. Quanto mais dependências um módulo tem, maior o trabalho que Jest tem que fazer para simular ele (mock it, em inglês). Algo que pode significativamente compensar esse custo de desempenho é por adicionar um transformador de código que move chamadas import
ou require
do topo de um módulo, onde são sempre executadas, para baixo no corpo do módulo, onde elas geralmente não são executadas. Isto pode reduzir o número de módulos que Jest precisa carregar quando estiver executando uma quantidade considerável de testes.
Para transformar declarações import
, existe babel-plugin-transform-inline-imports-commonjs e para transformar declarações require
, existe o plugin babel inline-requires
do Facebook, que faz parte do pacote babel-preset-fbjs
.
Eu estou usando npm3 e meus node_modules não estão carregando corretamente. #
Atualize jest-cli
para 0.9.0
ou acima.
Estou usando o babel e minhas importações "unmocked" não estão funcionando? #
Atualize jest-cli
para 0.9.0
ou acima.
Explicação:
jest.dontMock('foo'); import foo from './foo';
Em ES6, declarações de importação são içadas (hoisted, em inglês) antes de todas as outras
const foo = require('foo'); jest.dontMock('foo'); // Oops!
No Jest 0.9.0, foi introduzida uma nova API jest.unmock
. Juntamente com um plugin para babel, isto irá agora funcionar corretamente quando estiver usando babel-jest
:
jest.unmock('./foo'); // Use unmock! import foo from './foo'; // foo is not mocked!
Consulte o guia Começando para saber como ativar o suporte para babel.
Eu fiz upgrade para Jest 0.9.0 e meus testes agora estão falhando? #
Jest agora está usando por padrão Jasmine 2. Deve ser fácil atualizar usando o guia de atualização do Jasmine.
Se você gostaria de continuar usando o Jasmine 1, defina a opção de configuração testRunner
para jasmine1
ou passe --testRunner=jasmine1
como uma opção de linha de comando.
Problemas de compatibilidade #
Jest tira proveito dos novos recursos adicionados ao Node 4. Nós recomendamos que você atualize para a última versão estável do Node. A versão mínima suportada é v4.0.0
. Versões 0.x.x
não são suportadas.
Ainda sem resolução? #
Consulte a ajuda.