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

Jest模拟Document类实例方法报错:Document不是构造函数

问题解决:Jest模拟Document类时出现"Document is not a constructor"错误

问题原因

  1. 导出方式不匹配:业务代码中const Document = require('@model/documentModel')直接将模块导出值作为构造函数使用,说明Document是模块的默认导出。但你的Jest mock返回的是包含Document属性的对象(命名导出形式),导致require得到的是普通对象而非构造函数,调用new Document()时触发报错。
  2. mock方法冗余:create: jest.fn().jest.fn()存在重复调用jest.fn()的无效语法,属于错误写法。

解决方案

修正Jest mock的导出形式,使其与原模块的默认导出匹配,并修复create方法的mock写法:

正确的Mock代码

// 模拟默认导出的Document构造函数
jest.mock('@model/documentModel', () => {
  return jest.fn().mockImplementation(() => ({
    // 模拟异步create方法,返回预设的mockedDocument
    create: jest.fn().mockResolvedValue(mockedDocument)
  }));
});

补充说明

  • 如果原模块是命名导出(比如module.exports = { Document }),业务代码需改为const { Document } = require('@model/documentModel'),此时对应的mock写法应为:
    jest.mock('@model/documentModel', () => {
      return {
        Document: jest.fn().mockImplementation(() => ({
          create: jest.fn().mockResolvedValue(mockedDocument)
        }))
      };
    });
    
  • 由于create是异步方法,使用mockResolvedValue模拟成功返回的Promise;若需模拟失败场景,可改用mockRejectedValue。

验证示例

在测试用例中验证mock是否正确触发:

const Document = require('@model/documentModel');
const createDocumentAndReferral = require('./your-business-file-path');

describe('createDocumentAndReferral', () => {
  it('should initialize and call Document.create', async () => {
    const mockedDocument = { createdAt: Date.now(), fileName: 'test.jpg' };
    const testRecordId = 'test-123';

    await createDocumentAndReferral({ recordId: testRecordId });

    // 验证Document构造函数的调用参数
    expect(Document).toHaveBeenCalledWith({
      recordId: testRecordId,
      fileName: `regression-test___${testRecordId}.jpg`
    });
    // 验证create方法是否被调用
    expect(Document.mock.results[0].value.create).toHaveBeenCalled();
  });
});

内容的提问来源于stack exchange,提问作者Rafael Polonio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:00:18