Zastanawiam się, czy istnieje lepszy sposób niepełnosprawnymi błędów konsoli wewnątrz w konkretnym teście żartem (czyli przywrócić oryginalną konsolę przed / po każdej próbie).
Oto moje obecne podejście:
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");
});
});
Czy istnieje czystszy sposób na osiągnięcie tego samego? Chciałbym tego uniknąć spyOn
, ale mockRestore
wydaje mi się, że to działa .
Dzięki!
źródło
setupTestFrameworkScriptFile
jest przestarzały na korzyśćsetupFilesAfterEnv
.global.console
jest rzeczywiście prostym sposobem i można je wykonać za pomocą dowolnego skonfigurowanegosetupFilesAfterEnv
. Uważaj, aby kpić ze wszystkich natywnych metodconsole
obiektu, bo możesz napotkać inne nieoczekiwane błędy.Ponieważ każdy plik testowy działa we własnym wątku, nie ma potrzeby jego przywracania, jeśli chcesz go wyłączyć dla wszystkich testów w jednym pliku. Z tego samego powodu możesz też po prostu pisać
console.log = jest.fn() expect(console.log).toHaveBeenCalled();
źródło
Jeśli chcesz to zrobić tylko dla konkretnego testu:
beforeEach(() => { jest.spyOn(console, 'warn').mockImplementation(() => {}); });
źródło
Okazało się, że odpowiedź powyżej re: tłumienie
console.log
we wszystkich zestawów testów wyrzucił błędy gdy wszelkie inneconsole
metody (npwarn
,error
) były nazywane, ponieważ został zastępując całą globalnąconsole
obiekt.To nieco podobne podejście zadziałało u mnie w przypadku Jest 22+:
package.json
"jest": { "setupFiles": [...], "setupTestFrameworkScriptFile": "<rootDir>/jest/setup.js", ... }
jest / setup.js
jest.spyOn(global.console, 'log').mockImplementation(() => jest.fn());
Korzystanie z tej metody
console.log
jest tylko wyszydzane, a inneconsole
metody pozostają niezmienione.źródło
Dla mnie bardziej przejrzystym sposobem (czytelnik potrzebuje niewielkiej wiedzy na temat API jest, aby zrozumieć, co się dzieje), jest ręczne zrobienie tego, co robi mockRestore:
// at start of test you want to suppress const consoleLog = console.log; console.log = jest.fn(); // at end of test console.log = consoleLog;
źródło
clearMocks
iresetMocks
konfiguracja opcji, ale oboje domyślniefalse
, a żadna z tych faktycznie przywrócić początkową realizację nawet jeśli jest ustawiony natrue
. Biorąc pod uwagę, że jest to opcja konfiguracji, którą można zmienić w pewnym momencie, myślę, że najlepszą praktyką jest ręczne czyszczenie, aby upewnić się, że testy nie spowodują problemów w przyszłości.Innym podejściem jest użycie
process.env.NODE_ENV
. W ten sposób można wybiórczo wybrać, co wyświetlać (a czego nie) podczas uruchamiania testów: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'); }
lub
const logDev = msg => { if (process.env.NODE_ENV === 'development') { console.log(msg); } } logDev('Show output only while in "development" mode');
Będzie to wymagało umieszczenia tej konfiguracji na
package.json
:"jest": { "globals": { "NODE_ENV": "test" } }
Zwróć uwagę, że takie podejście nie jest bezpośrednim rozwiązaniem pierwotnego pytania, ale daje oczekiwany rezultat, o ile ma się możliwość objęcia
console.log
wspomnianego warunku.źródło
===
się!==
w zależności od potrzeb. Stosuję to podejście od lat i działa bezbłędnie, ale dostosowuję się do moich potrzeb.