في عالم مثالي قاعدة التعليمات البرمجية ليست هناك حاجة للتعامل مع الكائنات العالمية، ولكن العالم قواعد التعليمات البرمجية فوضوية - وهكذا قيد الاختبار.
ما تريد تجنبه بأي ثمن هو أن يؤثر اختبار واحد على الآخر. يجب أن تكون الاختبارات ذات معنى بغض النظر عن ترتيبها أو في حالة تخطي بعض الاختبارات.
الأسلوب الساذج للقيم الوهمية هو فقط تعيين الخصائص على أي قيمة تحتاجها في الاختبار.
يعد هذا أمرًا جيدًا طالما قمت بتغيير القيم في الكائنات المحلية المملوكة (التي تم إنشاؤها بواسطة) هذا الاختبار المحدد:
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(); }); });يجب عليك التنظيف
إذا كنت تريد التأكد من أن جميع الاختبارات تجد النظام في نفس الحالة (جديدة ونظيفة)، فأنت بحاجة إلى استعادة حالة المحاكاة بعد كل اختبار.
الحل الأبسط هو تعيين خاصية تكوين RestoreMocks.
الخيار الأكثر مباشرة هو استدعاء jest.restoreAllMocks() في afterEach()
كيف تسخر من شيء ما لجميع الاختبارات
في بعض الأحيان تريد السخرية من الأشياء لجميع الاختبارات في الملف. إذا كنت تستخدم jest.spyOn() وjest.replaceProperty() على المستوى الأعلى أو في كتلة description()، فسيتم إعادة تعيين جميع Mocks بعد تنفيذ الاختبار الأول.
في المستوى الأعلى، يمكنك تجاوز الخصائص والأساليب بأمان، بدون jest.spyOn() وjest.replaceProperty().
إذا كنت تريد الاستهزاء بالأشياء فقط من أجل كتلة description()، فأنت بحاجة إلى إجراء هذه الاستدعاءات في ربط beforeEach().
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3