Troubleshooting
Uh oh, something went wrong? Use this guide to resolve issues with Jest.
Testes estão falhando e você não sabe por que
Tente usar o suporte à depuração embutido no Node. Note: This will only work in Node.js 8+.
Coloque uma instrução debugger;
em qualquer um dos seus testes e em seguida, no diretório do seu projeto, execute:
node --inspect-brk node_modules/.bin/jest --runInBand [any other arguments here]
or on Windows
node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]
This will run Jest in a Node process that an external debugger can connect to. Note that the process will pause until the debugger has connected to it.
To debug in Google Chrome (or any Chromium-based browser), open your browser and go to chrome://inspect
and click on "Open Dedicated DevTools for Node", which will give you a list of available node instances you can connect to. Click on the address displayed in the terminal (usually something like localhost:9229
) after running the above command, and you will be able to debug Jest using Chrome's DevTools.
The Chrome Developer Tools will be displayed, and a breakpoint will be set at the first line of the Jest CLI script (this is done to give you time to open the developer tools and to prevent Jest from executing before you have time to do so). 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.
Note: the
--runInBand
cli option makes sure Jest runs the test in the same process rather than spawning processes for individual tests. Normalmente Jest paraleliza execução de testes através de processos, mas é difícil de depurar vários processos ao mesmo tempo.
Depuração no VS Code
There are multiple ways to debug Jest tests with Visual Studio Code's built-in debugger.
Para anexar o depurador embutido, execute os testes, como foi mencionado anteriormente:
node --inspect-brk node_modules/.bin/jest --runInBand [any other arguments here]
or on Windows
node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]
Em seguida, anexe depurador do VS Code usando a configuração launch.json
a seguir:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach",
"port": 9229
}
]
}
Para iniciar automaticamente e anexar a um processo executando os seus testes, use a seguinte configuração:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Jest Tests",
"type": "node",
"request": "launch",
"runtimeArgs": [
"--inspect-brk",
"${workspaceRoot}/node_modules/.bin/jest",
"--runInBand"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
"port": 9229
}
]
}
or the following for Windows:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Jest Tests",
"type": "node",
"request": "launch",
"runtimeArgs": [
"--inspect-brk",
"${workspaceRoot}/node_modules/jest/bin/jest.js",
"--runInBand"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
"port": 9229
}
]
}
Se você estiver usando o create-react-app
do Facebook, você pode depurar seus testes Jesta com a seguinte configuração:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug CRA Tests",
"type": "node",
"request": "launch",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/react-scripts",
"args": ["test", "--runInBand", "--no-cache", "--env=jsdom"],
"cwd": "${workspaceRoot}",
"protocol": "inspector",
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}
Mais informações sobre depuração do Node podem ser encontradas aqui.
Depuração no WebStorm
A maneira mais fácil de depurar testes Jest no WebStorm é usando a configuração de executar/depurar Jest
. Vai iniciar os testes e automaticamente anexar o depurador.
No menu Run
do WebStorm selecione Edit Configurations...
. Em seguida, clique em +
e selecione Jest
. Opcionalmente, especifique o arquivo de configuração Jest, opções adicionais e variáveis de ambiente. Salve a configuração, coloque pontos de interrupção no código e, em seguida, clique no ícone verde Depurar para iniciar a depuração.
Se você estiver usando o create-react-app
do Facebook, na configuração do Jest executar/depurar especifique o caminho para o pacote react-scripts
no campo pacote Jest e adicionar --env=jsdom
para o campo de opções de Jest.
Problemas de Cache
The transform script was changed or Babel was updated and the changes aren't being recognized by Jest?
Tente novamente com --no-cache
. Jest armazena em cache os arquivos de módulo transformados para acelerar a execução de testes. If you are using your own custom transformer, consider adding a getCacheKey
function to it: getCacheKey in 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. Consider replacing the global promise implementation with your own, for example global.Promise = jest.requireActual('promise');
and/or consolidate the used Promise libraries to a single one.
If your test is long running, you may want to consider to increase the timeout by calling jest.setTimeout
jest.setTimeout(10000); // 10 segundos de timeout
Problemas com Watchman
Try running Jest with --no-watchman
or set the watchman
configuration option to 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).
While Jest is most of the time extremely fast on modern multi-core computers with fast SSDs, it may be slow on certain setups as our users have discovered.
Based on the findings, one way to mitigate this issue and improve the speed by up to 50% is to run tests sequentially.
Para isso, você pode executar testes na mesma "thread" usando --runInBand
:
# Using Jest CLI
jest --runInBand
# Using yarn test (e.g. with create-react-app)
yarn test --runInBand
Another alternative to expediting test execution time on Continuous Integration Servers such as Travis-CI is to set the max worker pool to ~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 yarn test (e.g. with create-react-app)
yarn 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!
In Jest 0.9.0, a new API jest.unmock
was introduced. Together with a plugin for babel, this will now work properly when using babel-jest
:
jest.unmock('./foo'); // Use unmock!
import foo from './foo';
// foo is not mocked!
See the [Getting Started]GettingStarted.md#using-babel) guide on how to enable babel support.
Eu fiz upgrade para Jest 0.9.0 e meus testes agora estão falhando?
Jest is now using Jasmine 2 by default. It should be easy to upgrade using the Jasmine upgrade guide.
If you would like to continue using Jasmine 1, set the testRunner
config option to jasmine1
or pass --testRunner=jasmine1
as a command line option.
Problemas de compatibilidade
Jest tira proveito dos novos recursos adicionados ao Node 6. We recommend that you upgrade to the latest stable release of Node. The minimum supported version is v6.0.0
. Versions 0.x.x
and 4.x.x
are not supported because the jsdom
version used in Jest doesn't support Node 4. However, if you need to run Jest on Node 4, you can use the testEnvironment
config to use a custom environment that supports Node 4, such as jest-environment-node
.
coveragePathIgnorePatterns
parece não ter nenhum efeito.
Certifique-se de que você não está usando o plugin de babel-plugin-Istambul
. Jest wraps Istanbul, and therefore also tells Istanbul what files to instrument with coverage collection. When using babel-plugin-istanbul
, every file that is processed by Babel will have coverage collection code, hence it is not being ignored by coveragePathIgnorePatterns
.
Defining Tests
Tests must be defined synchronously for Jest to be able to collect your tests.
As an example to show why this is the case, imagine we wrote a test like so:
// Don't do this it will not work
setTimeout(() => {
it('passes', () => expect(1).toBe(1));
}, 0);
When Jest runs your test to collect the test
s it will not find any because we have set the definition to happen asynchronously on the next tick of the event loop.
Note: This means when you are using test.each
you cannot set the table asynchronously within a beforeEach
/ beforeAll
.
Ainda sem resolução?
Consulte a ajuda.