You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:36:04