"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > اختبر أن كل MutationObserver غير متصل لتجنب تسرب الذاكرة

اختبر أن كل MutationObserver غير متصل لتجنب تسرب الذاكرة

تم النشر بتاريخ 2024-08-25
تصفح:691

Test that every MutationObserver is disconnected to avoid memory leaks

MutationObserver هي آلية مفيدة لمراقبة التغييرات في DOM والاستجابة لها.

توفر واجهة MutationObserver القدرة على مراقبة التغييرات التي يتم إجراؤها على شجرة DOM.

إليك مثال يراقب تغيير فئة الموضوع.

    function setUpThemeClassObservers() {
        const observer = new MutationObserver(() => {
            const themeClass = this.getThemeClass();
            this.fireStylesChangedEvent('themeChanged');
        });

        observer.observe(this.eGridDiv, {
            attributes: true,
            attributeFilter: ['class'],
        });

        // we must disconnect otherwise "this" will not be GC'd
        // causing a memory leak
        return () => observer.disconnect();
    }

ومع ذلك، إذا نسيت قطع الاتصال، فقد تعرض نفسك لتسرب الذاكرة اعتمادًا على ما يتم الوصول إليه من داخل وظائف MutationObserver.

ألن يكون رائعًا أن يكون لدينا اختبار يمكنه التحقق من أننا قمنا بفصل مراقبينا؟

التحقق التلقائي من الكود

اتضح أنه من الممكن التحقق من قطع اتصال كل MutationObserver الذي يراقب DOM. (قد تحتاج إلى أكثر من اختبار إذا كان عليك استخدام مسارات تعليمات برمجية مختلفة لإعداد MutationObservers)

الفكرة هي الاستهزاء بـ MutationObserver العالمي باستخدام نماذج فرعية لأساليب المراقبة وقطع الاتصال الخاصة به. قبل إرجاع النموذج، نقوم بتسجيله في مصفوفة حتى نتمكن من التحقق من صحة جميع الحالات في نهاية التشغيل التجريبي.

describe('Mutation Observers Disconnected', () => {

    let originalMutationObserver: typeof MutationObserver;

    const allMockedObservers: any = [];
    const mutationObserverMock = jest.fn().mockImplementation(() => {
        const mock = {
            observe: jest.fn(),
            disconnect: jest.fn(),
            takeRecords: jest.fn(),
        };
        allMockedObservers.push(mock);
        return mock;
    });

    beforeEach(() => {
        // Ensure we can restore the real MutationObserver after the test
        originalMutationObserver = global.MutationObserver;
        global.MutationObserver = mutationObserverMock;
    });

    afterEach(() => {
        global.MutationObserver = originalMutationObserver;
    });

    test('observer always disconnected after destroy', async () => {
        const api = createGrid();
        // Perform some actions if required to exercise the code paths
        api.destroy();

        expect(allMockedObservers.length).toBeGreaterThan(0);
        for (const mock of allMockedObservers) {
            expect(mock.observe).toHaveBeenCalled();
            expect(mock.disconnect).toHaveBeenCalled();
        }
    });
});

بهذه الطريقة يمكننا التحقق من أن كل MutationObserver، الذي تم إعداده أثناء الاختبار، تم أيضًا فصله في نهاية الاختبار.


ستيفن كوبر - مطور أول في AG Grid
تابعني على X @ScooperDev

بيان الافراج يتم استنساخ هذه المقالة على: https://dev.to/scooperdev/test-that-every-mattericoBserver-iS-Disconnected-to-avoid-memory-leaks-2fkp؟1 إذا كان هناك أي انتهاك ، فيرجى الاتصال بـ [email protected] لحذفه.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3