メモリ リークを避けるために、すべての MutationObserver が切断されていることをテストします。

WBOY
リリース: 2024-08-22 22:34:02
オリジナル
780 人が閲覧しました

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 関数内からのアクセス内容によってはメモリ リークにさらされる可能性があります。

オブザーバーの接続を解除していることを検証できるテストがあれば素晴らしいと思いませんか?

コードの自動検証

DOM を監視しているすべての MutationObserver も切断されていることを検証できることがわかりました。 (MutationObservers を設定するために異なるコード パスを実行する必要がある場合は、複数のテストが必要になる場合があります)

アイデアは、グローバル MutationObserver をその観察メソッドと切断メソッドのサブ モ​​ックでモックすることです。モックが返される前に、モックを配列に記録して、テスト実行の最後にすべてのインスタンスを検証できるようにします。

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

    let originalMutationObserver: typeof MutationObserver;

    const allMockedObservers: any = [];
    const mutationObserverMock = jest.fn<MutationObserver, [MutationCallback]>().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 もテスト終了時に切断されることを検証できます。


Stephen Cooper - AG Grid シニア開発者
X @ScooperDev でフォローしてください

以上がメモリ リークを避けるために、すべての MutationObserver が切断されていることをテストします。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!