Estou usando marionetistas e gracejos para executar alguns testes de front-end.
Meus testes têm a seguinte aparência:
describe("Profile Tab Exists and Clickable: /settings/user", () => {
test(`Assert that you can click the profile tab`, async () => {
await page.waitForSelector(PROFILE.TAB);
await page.click(PROFILE.TAB);
}, 30000);
});
Às vezes, quando executo os testes, tudo funciona como esperado. Outras vezes, recebo um erro:
Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.
at node_modules/jest-jasmine2/build/queue_runner.js:68:21
at Timeout.callback [as _onTimeout] (node_modules/jsdom/lib/jsdom/browser/Window.js:633:19)
Isso é estranho porque:
Especifiquei o tempo limite para 30000
Se eu recebo ou não esse erro é aparentemente muito aleatório
Alguém pode adivinhar por que isso está acontecendo?
Respostas:
Portanto, o tempo limite especificado aqui precisa ser menor que o tempo limite padrão.
O tempo limite padrão é
5000
e a estrutura por padrão éjasmine
no caso dejest
. Você pode especificar o tempo limite dentro do teste adicionandoMas isso seria específico para o teste. Ou você pode configurar o arquivo de configuração para a estrutura.
https://facebook.github.io/jest/docs/en/configuration.html#setuptestframeworkscriptfile-string
Veja também este tópico
https://github.com/facebook/jest/issues/5055
https://github.com/facebook/jest/issues/652
O erro de ortografia PS
setupFilesAfterEnv
(ou sejasetupFileAfterEnv
) também gera o mesmo erro.fonte
setupTestFrameworkScriptFile
item foi substituído porsetupFilesAfterEnv
, então ele se tornasetupFilesAfterEnv: ["./jest.setup.js"]
jest.setTimeout(10000)
poderiam ser adicionados a um único teste para um caso extremo de modo toda a configuração não tinha necessidade de mudança :)jest.setTimeout(30000);
emjest.config.js
I get "ReferenceError: jest não está definido". Tentei adicionar,const jest = require("jest");
mas recebo "TypeError: jest.setTimeout não é uma função".setupFilesAfterEnv
argumento emjest.config.js
apontará para outro arquivo em que colocamos ajest.setTimeout(30000)
opção. É bom podermos configurar isso, mas me parece um pouco complicado.Ele deve chamar
async/await
quando estiver assíncrono do teste.fonte
done
uma função assíncrona? Nós simplesmente não devolvemos Promessa ou indefinidos?page.click
. done () é usado, pelo menos no meu caso, principalmente para testar com retornos de chamada.done
retorno de chamada que não é necessário.done
neste caso) no retorno de chamada faz com que o Jest aguarde até que esse parâmetro seja chamado. Sua presença é significativa, mesmo que não seja usada.A resposta a esta pergunta mudou conforme o Jest evoluiu. Resposta atual (março de 2019):
Você pode substituir o tempo limite de qualquer teste individual adicionando um terceiro parâmetro ao
it
. ieit('runs slow', () => {...}, 9999)
Você pode alterar o padrão usando
jest.setTimeout
. Para fazer isso:e
done
não é necessário com a abordagem assíncrona / aguardada.fonte
Gostaria de acrescentar (isso é um pouco longo para um comentário) que, mesmo com o tempo limite dos
3000
meus testes, algumas vezes (aleatoriamente) falhava comGraças à ótima resposta de @ Tarun, acho que a maneira mais curta de corrigir muitos testes é:
fonte
jest.setTimeout()
dentrobeforeEach
, chamá-lo uma vez é suficiente para todos os testes.Esta é uma atualização relativamente nova, mas é muito mais direta. Se você estiver usando o jest 24.9.0 ou superior, basta adicionar
testTimeout
à sua configuração:fonte
Certifique-se de invocar
done();
retornos de chamada ou isso simplesmente não passará no teste.Aplica-se a todas as outras funções que possuem um retorno de chamada done ().
fonte
Para o jest 24.9+, você também pode definir o tempo limite na linha de comando adicionando
--testTimeout
Aqui está um trecho de seus documentos
fonte
Recentemente, deparei com esse problema por um motivo diferente: estava executando alguns testes de forma síncrona usando
jest -i
, e o tempo limite acabaria. Qualquer que seja o raciocínio, a execução dos mesmos testes usandojest --runInBand
(mesmo que-i
seja um alias) não atinge o tempo limite.Talvez isso ajude alguém
¯\_(:/)_/¯
fonte
O problema do tempo limite ocorre quando a rede é lenta ou são feitas várias chamadas de rede
await
, esses cenários excedem o tempo limite padrão, ou seja, 5000 ms. Para evitar o erro de tempo limite, aumente o tempo limite das globais que suportam um tempo limite. Uma lista de globais e sua assinatura pode ser encontrada aqui .For Jest 24.9
fonte
Se em Jest <= 23:
Se estiver em Jest> 23:
fonte
Para aqueles que procuram uma explicação sobre
jest --runInBand
você, consulte a documentação Executando marionetistas em ambientes de CI https://github.com/smooth-code/jest-puppeteerfonte
Caso alguém não conserte o problema, use os métodos acima, consertei o meu envolvendo a função assíncrona por uma função de seta. Como em:
fonte
No meu caso, esse erro começou a aparecer aleatoriamente e não desapareceu mesmo depois de definir um tempo limite de 30000. Simplesmente encerrar o processo no terminal e executar novamente os testes resolveu o problema para mim. Também removi o tempo limite e os testes ainda estão passando novamente.
fonte
No nó ... o que vejo as pessoas fizeram como exemplo está abaixo, usando
fakeEventEmitter
fonte