如何使用Jest对Node.js中html-pdf的create().toBuffer()链式调用进行Mock
解决方案
你之前的Mock写法不符合html-pdf的真实调用逻辑:真实场景下create()方法不会返回Promise,而是直接返回一个挂载了toBuffer方法的实例对象,所以你只需要调整create()方法的返回值结构即可。
基础Mock实现(默认模拟成功场景)
jest.mock('html-pdf', () => { // 定义toBuffer的Mock实现,默认返回成功的测试Buffer const mockToBuffer = jest.fn((callback) => { const testBuffer = Buffer.from('mock pdf content', 'utf-8'); callback(null, testBuffer); }); return { create: jest.fn(() => ({ toBuffer: mockToBuffer })), // 暴露内部的toBuffer Mock,方便单测中自定义返回逻辑 __getMockToBuffer: () => mockToBuffer }; });
自定义场景使用示例
1. 成功场景测试
你可以直接断言业务逻辑返回的base64是否符合预期:
test('html转pdf成功返回正确base64', async () => { // 这里调用你封装的html转pdf业务方法 const result = await yourHtmlToPdfMethod('<p>test</p>'); // Buffer.from('mock pdf content').toString('base64')的结果就是如下值 expect(result).toBe('bW9jayBwZGYgY29udGVudA=='); });
2. 失败场景测试
如果需要模拟pdf生成失败的情况,可以在测试用例中改写toBuffer的Mock实现:
test('html转pdf失败正确抛出错误', async () => { const pdf = require('html-pdf'); const mockError = new Error('pdf生成异常'); // 改写一次toBuffer的逻辑,返回错误 pdf.__getMockToBuffer().mockImplementationOnce((callback) => { callback(mockError, null); }); // 断言业务代码正确抛出了对应错误 await expect(yourHtmlToPdfMethod('<p>test</p>')).rejects.toThrow(mockError); });
内容的提问来源于stack exchange,提问作者Abhijeet Kharkar
相关产品推荐
相关产品推荐

