Eu me pergunto se há uma maneira melhor de desabilitar os erros do console dentro de um teste Jest específico (ou seja, restaurar o console original antes / depois de cada teste).
Aqui está minha abordagem atual:
describe("Some description", () => {
let consoleSpy;
beforeEach(() => {
if (typeof consoleSpy === "function") {
consoleSpy.mockRestore();
}
});
test("Some test that should not output errors to jest console", () => {
expect.assertions(2);
consoleSpy = jest.spyOn(console, "error").mockImplementation();
// some function that uses console error
expect(someFunction).toBe("X");
expect(consoleSpy).toHaveBeenCalled();
});
test("Test that has console available", () => {
// shows up during jest watch test, just as intended
console.error("test");
});
});
Existe uma maneira mais limpa de realizar a mesma coisa? Eu gostaria de evitar spyOn
, mas mockRestore
só parece funcionar com isso .
Obrigado!
fonte
setupTestFrameworkScriptFile
foi preterido e substituído porsetupFilesAfterEnv
.global.console
é realmente uma maneira simples de fazer e pode ser feito por meio de qualquer configuraçãosetupFilesAfterEnv
. Cuidado para simular todos os métodos nativos doconsole
objeto ou você pode encontrar outros erros inesperados.Como cada arquivo de teste é executado em seu próprio thread, não há necessidade de restaurá-lo se você quiser desativá-lo para todos os testes em um arquivo. Pelo mesmo motivo, você também pode simplesmente escrever
console.log = jest.fn() expect(console.log).toHaveBeenCalled();
fonte
Se você quiser fazer isso apenas para um teste específico:
beforeEach(() => { jest.spyOn(console, 'warn').mockImplementation(() => {}); });
fonte
Descobri que a resposta acima re: suprimir
console.log
em todos os conjuntos de testes gerava erros quando quaisquer outrosconsole
métodos (por exemplowarn
,error
) eram chamados, pois estava substituindo todo oconsole
objeto global .Essa abordagem um tanto semelhante funcionou para mim com Jest 22+:
package.json
"jest": { "setupFiles": [...], "setupTestFrameworkScriptFile": "<rootDir>/jest/setup.js", ... }
jest / setup.js
jest.spyOn(global.console, 'log').mockImplementation(() => jest.fn());
Usando este método, apenas
console.log
é simulado e outrosconsole
métodos não são afetados.fonte
Para mim, uma maneira mais clara / limpa (o leitor precisa de pouco conhecimento da API jest para entender o que está acontecendo) é fazer manualmente o que o mockRestore faz:
// at start of test you want to suppress const consoleLog = console.log; console.log = jest.fn(); // at end of test console.log = consoleLog;
fonte
clearMocks
eresetMocks
configuração de opção, mas ambos padrão parafalse
, e nem de quem realmente restaurar a implementação inicial, mesmo se estiver definida paratrue
. E, considerando que esta é uma opção de configuração que pode ser alterada em algum momento, acho que é uma prática recomendada limpar manualmente para garantir que seus testes não causem problemas no futuro.Outra abordagem é usar
process.env.NODE_ENV
. Desta forma, pode-se escolher seletivamente o que mostrar (ou não) durante a execução dos testes:if (process.env.NODE_ENV === 'development') { console.log('Show output only while in "development" mode'); } else if (process.env.NODE_ENV === 'test') { console.log('Show output only while in "test" mode'); }
ou
const logDev = msg => { if (process.env.NODE_ENV === 'development') { console.log(msg); } } logDev('Show output only while in "development" mode');
Isso exigirá que esta configuração seja colocada em
package.json
:"jest": { "globals": { "NODE_ENV": "test" } }
Observe que esta abordagem não é uma solução direta para a questão original, mas dá o resultado esperado, desde que se tenha a possibilidade de envolver o
console.log
com a condição mencionada.fonte
===
por de!==
acordo com suas necessidades. Uso essa abordagem há anos e ela funciona perfeitamente, mas faço ajustes de acordo com minhas necessidades.