Jest模拟Document类实例方法报错:Document不是构造函数
问题解决:Jest模拟Document类时出现"Document is not a constructor"错误
问题原因
- 导出方式不匹配:业务代码中
const Document = require('@model/documentModel')直接将模块导出值作为构造函数使用,说明Document是模块的默认导出。但你的Jest mock返回的是包含Document属性的对象(命名导出形式),导致require得到的是普通对象而非构造函数,调用new Document()时触发报错。 - 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
相关产品推荐
相关产品推荐

