Aku ingin tahu apakah ada cara yang lebih baik untuk kesalahan konsol menonaktifkan dalam sebuah tes Jest tertentu (yaitu, mengembalikan konsol asli sebelum / sesudah setiap tes).
Inilah pendekatan saya saat ini:
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");
});
});
Adakah cara yang lebih bersih untuk mencapai hal yang sama? Saya ingin menghindari spyOn
, tetapi mockRestore
sepertinya hanya bekerja dengannya .
Terima kasih!
sumber
setupTestFrameworkScriptFile
tidak digunakan lagi karenasetupFilesAfterEnv
.global.console
- olok memang cara yang sederhana, dan dapat dilakukan melalui konfigurasi apa punsetupFilesAfterEnv
. Berhati-hatilah untuk memalsukan semua metode asliconsole
objek atau Anda mungkin mengalami kesalahan tak terduga lainnya.Karena setiap file pengujian berjalan di utasnya sendiri, tidak perlu memulihkannya jika Anda ingin menonaktifkannya untuk semua pengujian dalam satu file. Untuk alasan yang sama Anda juga bisa menulis
console.log = jest.fn() expect(console.log).toHaveBeenCalled();
sumber
Jika Anda ingin melakukannya hanya untuk tes tertentu:
beforeEach(() => { jest.spyOn(console, 'warn').mockImplementation(() => {}); });
sumber
Saya menemukan bahwa jawaban di atas re: menekan
console.log
di semua rangkaian pengujian menimbulkan kesalahan ketikaconsole
metode lain (misalnyawarn
,error
) dipanggil karena itu menggantikan seluruhconsole
objek global .Pendekatan yang agak mirip ini berhasil untuk saya dengan Jest 22+:
package.json
"jest": { "setupFiles": [...], "setupTestFrameworkScriptFile": "<rootDir>/jest/setup.js", ... }
jest / setup.js
jest.spyOn(global.console, 'log').mockImplementation(() => jest.fn());
Menggunakan metode ini, hanya
console.log
diejek danconsole
metode lain tidak terpengaruh.sumber
Bagi saya cara yang lebih jelas / bersih (pembaca membutuhkan sedikit pengetahuan tentang API lelucon untuk memahami apa yang terjadi), adalah dengan melakukan apa yang dilakukan mockRestore secara manual:
// at start of test you want to suppress const consoleLog = console.log; console.log = jest.fn(); // at end of test console.log = consoleLog;
sumber
clearMocks
danresetMocks
konfigurasi tetapi keduanya defaultfalse
, dan tidak satu pun dari mereka yang benar-benar memulihkan implementasi awal bahkan jika disetel ketrue
. Dan, mengingat ini adalah opsi konfigurasi yang dapat diubah di beberapa titik, menurut saya praktik terbaik adalah membersihkan secara manual untuk memastikan pengujian Anda tidak akan menimbulkan masalah di masa mendatang.Pendekatan lain adalah dengan menggunakan
process.env.NODE_ENV
. Dengan cara ini seseorang dapat secara selektif memilih apa yang akan ditampilkan (atau tidak) saat menjalankan tes: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'); }
atau
const logDev = msg => { if (process.env.NODE_ENV === 'development') { console.log(msg); } } logDev('Show output only while in "development" mode');
Ini akan membutuhkan konfigurasi ini untuk ditempatkan pada
package.json
:"jest": { "globals": { "NODE_ENV": "test" } }
Perhatikan bahwa pendekatan ini bukanlah solusi langsung untuk pertanyaan awal, tetapi memberikan hasil yang diharapkan selama seseorang memiliki kemungkinan untuk membungkusnya
console.log
dengan kondisi yang disebutkan.sumber
===
dengan yang!==
Anda butuhkan. Saya telah menggunakan pendekatan ini selama bertahun-tahun dan berhasil dengan sempurna, tetapi saya melakukan penyesuaian sesuai kebutuhan saya.