在 TypeScript 类层次结构中对私有方法和事件侦听器进行单元测试

问题描述 投票:0回答:1

我是为私有方法编写单元测试的新手,我一直在研究如何在 TypeScript 中实现这一点。但是,我找不到适合我的场景的解决方案。

这是我的 TypeScript 代码的简化版本:

export class CallbackManager {
   protected queue: Set<() => void>;
   constructor() {
        this.queue = new Set();
   }
}

export class Report extends CallbackManager {
   public addToQueue(publishMetric: () => void): void {
        this.queue.add(publishMetric);
   }

   private flushQueue(): void {
        if (this.queue.size > 0) {
            this.queue.forEach((cb) => {
                cb();
            });

            this.queue.clear();
        }
    }

    public initializeBatching(): void {
        addEventListener('visibilitychange', () => {
            if (document.visibilityState === 'hidden') {
                this.flushQueue();
            }
        });
    }
}

这是我在测试中试图实现的目标:

测试 addToQueue 方法:我想确保调用 addToQueue 会向队列添加一个函数。

describe('addToQueue', () => {
    it('should add a function to the queue', () => {
        const mockFunction = jest.fn();
        const report = new Report();
        report.addToQueue(mockFunction);
        expect((report as any).queue.size).toBe(1); // Accessing protected property directly for testing
    });
});

但是,我遇到了此错误:属性“queue”受保护,只能在类“CallbackManager”及其子类中访问。

测试initializeBatching方法:我想验证在调用initializeBatching时是否添加了visibilitychange事件监听器。 间接测试flushQueue方法:我也想测试visibilitychange事件发生时是否调用flushQueue方法,但是flushQueue是私有方法。 如果您能提供有关如何在 TypeScript 中有效地进行这些测试的任何见解,我将不胜感激。谢谢!

javascript typescript testing ts-jest javascript-inheritance
1个回答
0
投票

您应该测试您的模拟函数是否被调用。

expect(mockFunction).toHaveBeenCalled();
© www.soinside.com 2019 - 2024. All rights reserved.