Jest: जब थर्ड-पार्टी-लायब्रेरी द्वारा इसका उपयोग किया जाता है तो कंसोल को कैसे मॉक करें?


84

मैं सांत्वना देने की कोशिश कर रहा हूं। सांत्वना / त्रुटि लेकिन मैं नहीं कर सकता। मैं एक तृतीय-पक्ष-लायब्रेरी का उपयोग करता हूं, जो कंसोल को अंदर बुलाती है। मुझे यह परीक्षण करने की आवश्यकता थी कि इसे बुलाया गया था या नहीं। मेरे परीक्षण के मामले में, मैं कंसोल को रोकने की कोशिश कर रहा था। लेकिन यह मदद नहीं करता था। उसके बाद मैं सांत्वना देने की कोशिश कर रहा था क्योंकि यह या तो मैन्युअल रूप से काम नहीं करता था।

console.warn = jest.fn();
testSchema('/app/components/Users/UserItem/UserItemContainer.js');
expect(console.warn).toBeCalled();

काम नहीं किया

console.warn = jest.fn();
testSchema('/app/components/Users/UserItem/UserItemContainer.js');
console.warn('error');
expect(console.warn).toBeCalled();

काम किया। लेकिन मैं अभी भी console.warn node_modules/babel-relay-plugin/lib/getBabelRelayPlugin.js:138टर्मिनल में देखता हूं । क्या कोई मेरी मदद कर सकता है?

जवाबों:


145

आपको globalवैश्विक संदर्भ में वस्तुओं तक पहुंचने के लिए उपयोग करना होगा

global.console = {warn: jest.fn()}
expect(console.warn).toBeCalled()

या उपयोग में jest.spyOnजोड़ा गया19.0.0

jest.spyOn(global.console, 'warn')

2
हाँ दोस्तों यह काम करता है। लेकिन एक बात यह है कि ग्लोबल घोषित करने के बाद आपको लिब की आवश्यकता होती है। कंसोल। मैंने गलत किया। मुझे अपने दायित्व की आवश्यकता थी और उसके बाद वैश्विक घोषित किया। धन्यवाद।
एररप्रो डे

2
दिलचस्प यह है कि जेस्ट की वेबसाइट पर यह कहीं भी प्रलेखित नहीं है। मैं खोज रहा हूं और इसे समझाने वाला कुछ भी नहीं पा सकता।
लियोनार्डो

2
टाइपस्क्रिप्ट के साथ: त्रुटि TS2322: टाइप '{चेतावनी: मॉक <{}>; } 'कंसोल' टाइप करने के लिए असाइन नहीं किया जाता है।
गेरार्ड ब्रूल

8
बस इतना है कि सभी को पता है। global.console = {...}होगा दबाने त्रुटि jest.spyOn(...)नहीं होगा। आप तय करते हैं कि आप त्रुटियों को अपने परीक्षणों में दबाए रखना चाहते हैं या नहीं।
a11smiles

38
मैं पसंद करता हूं jest.spyOn(...)क्योंकि इसे साफ करना आसान है और मैं टाइपस्क्रिप्ट का उपयोग कर रहा हूं, लेकिन @ a11smiles उल्लेख के रूप में आउटपुट में त्रुटियों को दबाना चाहता था। इसलिए मैं प्रयोग किया जाता है jest.spyOn(global.console, "warn").mockImplementation(() => {})जो जासूसी करने के लिए अंतर्निहित के माध्यम से बुला से बचाता हैconsole.warn
djskinner

73

का उपयोग करें jest.spyOn()और spy.mockRestore()

const spy = jest.spyOn(console, 'warn').mockImplementation();
...
spy.mockRestore();

स्वीकृत उत्तर मूल को पुनर्स्थापित नहीं करता है console.warn()और उसी फ़ाइल के अंदर अन्य परीक्षणों को "समझौता" करेगा (यदि console.warn()अन्य परीक्षणों के अंदर उपयोग किया जाता है या कोड का परीक्षण किया जा रहा है)।

FYI करें यदि आप console.warn = jest.fn()एक परीक्षण फ़ाइल में उपयोग करते हैं , तो यह अन्य परीक्षण फ़ाइलों को प्रभावित नहीं करेगा (उदाहरण के लिए कंसोल। अन्य परीक्षण फ़ाइलों में मूल मूल्य पर वापस आ जाएगा)।

सलाह: आप spy.mockRestore()अंदर बुला सकते हैं afterEach()/ afterAll()यह सुनिश्चित करने के लिए कि यदि कोई परीक्षण क्रैश हो जाता है, तो भी वह उसी फ़ाइल से अन्य परीक्षणों से समझौता नहीं करेगा (उदाहरण के लिए उसी फ़ाइल के अंदर परीक्षण पूरी तरह से अलग हैं)।

पूर्ण उदाहरण:

const spy = jest.spyOn(console, 'warn').mockImplementation();
console.warn('message1'); // Won't be displayed (mocked)
console.warn('message2'); // Won't be displayed (mocked)
expect(console.warn).toHaveBeenCalledTimes(2);
expect(spy).toHaveBeenCalledTimes(2); // Another syntax
expect(console.warn).toHaveBeenLastCalledWith('message2');
expect(spy).toHaveBeenLastCalledWith('message2'); // Another syntax
expect(spy.mock.calls).toEqual([['message1'], ['message2']]);
expect(console.warn.mock.calls).toEqual([['message1'], ['message2']]);
spy.mockRestore(); // IMPORTANT
//console.warn.mockRestore(); // Another syntax

console.warn('message3'); // Will be displayed (not mocked anymore)
expect(spy).toHaveBeenCalledTimes(0); // Not counting anymore
expect(spy.mock.calls).toEqual([]);
//expect(console.warn.mock.calls).toEqual([]); // Crash

आप लिख नहीं सकते

console.warn = jest.fn().mockImplementation();
... 
console.warn.mockRestore();

क्योंकि यह मूल को पुनर्स्थापित नहीं करेगा console.warn()

/! \ mockImplementationOnce()आप के साथ अभी भी कॉल करने की आवश्यकता होगी spy.mockRestore():

// /!\
const spy = jest.spyOn(console, 'warn').mockImplementationOnce(() => {});
console.warn('message1'); // Won't be displayed (mocked)
expect(console.warn).toHaveBeenCalledTimes(1);
expect(spy).toHaveBeenCalledTimes(1); // Another syntax
expect(console.warn).toHaveBeenLastCalledWith('message1');
expect(spy).toHaveBeenLastCalledWith('message1'); // Another syntax
expect(spy.mock.calls).toEqual([['message1']]);
expect(console.warn.mock.calls).toEqual([['message1']]);

console.warn('message2'); // Will be displayed (not mocked anymore)
// /!\
expect(console.warn).toHaveBeenCalledTimes(2); // BAD => still counting
expect(spy.mock.calls).toEqual([['message1'], ['message2']]);
expect(console.warn.mock.calls).toEqual([['message1'], ['message2']]);

spy.mockRestore(); // IMPORTANT
//console.warn.mockRestore(); // Another syntax
console.warn('message3'); // Will be displayed (not mocked anymore)
expect(spy).toHaveBeenCalledTimes(0); // Not counting anymore
expect(spy.mock.calls).toEqual([]);
//expect(console.warn.mock.calls).toEqual([]); // Crash

आप यह भी लिख सकते हैं:

const assert = console.assert;
console.assert = jest.fn();
...
console.assert = assert;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.