एक आदर्श दुनिया में कोडबेस वैश्विक वस्तुओं में हेरफेर करने की कोई आवश्यकता नहीं है, लेकिन दुनिया कोडबेस गड़बड़ हैं - और इसी तरह परीक्षण कर रहा है।
आप हर कीमत पर जिस चीज से बचना चाहते हैं, वह यह है कि एक परीक्षा दूसरे को प्रभावित करेगी। परीक्षण सार्थक होने चाहिए चाहे उनका क्रम कुछ भी हो या कुछ परीक्षण छोड़ दिए गए हों।
नकली मूल्यों के लिए एक सरल दृष्टिकोण यह है कि गुणों को अपने परीक्षण में आपको जो भी मूल्य चाहिए, उसे सेट करें।
यह तब तक ठीक है जब तक आप इस विशिष्ट परीक्षण के स्वामित्व वाली (निर्मित) स्थानीय वस्तुओं में मान बदलते हैं:
describe("override properties of local objects", () => { it("works and is harmless", () => { const myArray = [1]; myArray.length = 0; expect(myArray).toHaveLength(0); }); it("does not affect the next test", () => { const myArray = [1]; expect(myArray).toHaveLength(1); }); });
यदि आप वैश्विक वस्तुओं के लिए ऐसा करते हैं, तो यह गड़बड़ हो जाता है:
describe("don't override properties of global objects", () => { it("works before the property is overridden", () => { expect(window.innerWidth).toBeGreaterThan(0); }); it("works, but is evil", () => { window.innerWidth = 0; expect(window.innerWidth).toBe(0); }); it("fails in the test after the property was overridden", () => { expect(() => { expect(window.innerWidth).toBeGreaterThan(0); //यही वह चीज़ है जिसके लिए jest.replaceProperty() बनाया गया था:
describe("use jest.replaceProperty() to override properties of global objects", () => { afterEach(() => { jest.restoreAllMocks(); }); it("works before the property is overridden", () => { expect(window.innerWidth).toBeGreaterThan(0); }); it("works and is harmless", () => { jest.replaceProperty(window, "innerWidth", 0); expect(window.innerWidth).toBe(0); }); it("does not affect the next test", () => { expect(window.innerWidth).toBeGreaterThan(0); }); });मज़ाक उड़ाने के तरीके
विधियों का गुणों के समान मज़ाक उड़ाया जा सकता है।
describe("override methods of local objects using jest.fn()", () => { it("works and is harmless", () => { const mySet = new Set([1]); mySet.has = jest.fn().mockReturnValue(false); expect(mySet.has(1)).toBeFalsy(); }); it("does not affect the next test", () => { const mySet = new Set([1]); expect(mySet.has(1)).toBeTruthy(); }); });यदि आप वैश्विक वस्तुओं पर myObject.someFunction = jest.fn() का उपयोग करते हैं, तो आपके परीक्षण एक-दूसरे पर निर्भर हो सकते हैं और अपना अर्थ खो सकते हैं:
describe("don't override methods of global objects using jest.fn()", () => { it("works before the method is overridden", () => { expect(document.getElementById("foo")).toBeNull(); }); it("works, but is evil", () => { const el = document.createElement("div"); document.getElementById = jest.fn().mockReturnValue(el); expect(document.getElementById("foo")).toBe(el); }); it("fails in the test after the property was overridden", () => { expect(() => { expect(document.getElementById("foo")).toBeNull(); //हमें वैश्विक वस्तुओं में तरीकों का नकल कैसे करना चाहिए? यही वह चीज़ है जिसके लिए jest.spyOn() अच्छा है:
describe("use jest.spyOn() to override methods of global objects", () => { afterEach(() => { jest.restoreAllMocks(); }); it("works before the method is overridden", () => { expect(document.getElementById("foo")).toBeNull(); }); it("works and is harmless", () => { const el = document.createElement("div"); jest.spyOn(document, "getElementById").mockReturnValue(el); expect(document.getElementById("foo")).toBe(el); }); it("does not affect the next test", () => { expect(document.getElementById("foo")).toBeNull(); }); });आपको सफ़ाई करनी होगी
यदि आप यह सुनिश्चित करना चाहते हैं कि सभी परीक्षण सिस्टम को एक ही (ताजा, साफ) स्थिति में पाते हैं, तो आपको प्रत्येक परीक्षण के बाद मॉक की स्थिति को बहाल करना होगा।
सबसे सरल समाधान रीस्टोरमॉक्स कॉन्फ़िगरेशन प्रॉपर्टी सेट करना है।
सबसे सीधा विकल्प jest.restoreAllMocks() को AfterEach() में कॉल करना है
सभी परीक्षणों के लिए किसी चीज़ का मॉक कैसे करें
कभी-कभी आप किसी फ़ाइल में सभी परीक्षणों के लिए चीज़ों का मॉक करना चाहते हैं। यदि आप शीर्ष स्तर पर या डिस्क्रिप्शन() ब्लॉक में jest.spyOn() और jest.replaceProperty() का उपयोग करते हैं, तो पहला परीक्षण निष्पादित होने के बाद सभी मोक्स रीसेट हो जाएंगे।
शीर्ष स्तर पर आप jest.spyOn() और jest.replaceProperty() के बिना, गुणों और विधियों को सुरक्षित रूप से ओवरराइड कर सकते हैं।
यदि आप केवल डिस्क्रिप्शन() ब्लॉक के लिए चीजों को मॉक करना चाहते हैं, तो आपको इन कॉल्स को beforeEach() हुक में करना होगा।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3