Jest mock Mongoose Model时报Account不是构造函数该如何修复
问题原因
你当前mock的Account是普通JS对象,仅包含create/findOne等静态方法,没有实现构造函数能力,而accountService中使用new Account()语法调用构造函数实例化模型,因此触发TypeError: Account is not a constructor错误。
另外你accountService中new Account(user_id: data.user_id)写法存在语法错误,JS中给构造函数传对象参数需要用花括号包裹,正确写法为new Account({ user_id: data.user_id })。
修复方案
修改jest.mock的实现,将Account定义为可实例化的构造函数,同时挂载Mongoose模型对应的静态方法与实例方法:
jest.mock('../../src/models/Account', () => { // 定义可实例化的Mock构造函数 const mockAccount = function(data) { // 自定义实例属性,匹配真实Mongoose模型的行为 this.user_id = data.user_id; // mock实例常用的save方法 this.save = jest.fn().mockResolvedValue(this); return this; }; // 挂载Mongoose模型的静态方法 mockAccount.create = jest.fn(); mockAccount.findOne = jest.fn(); mockAccount.find = jest.fn(); return { Account: mockAccount }; });
同时补全createAccount的逻辑,否则函数无返回值,测试断言会失败:
// 修正后的accountService代码 async function createAccount(data) { const account = new Account({ user_id: data.user_id }); return await account.save(); }
测试用例优化
你可以增加构造函数调用参数的验证,确保逻辑符合预期:
it('Run create account function', async () => { const testData = { user_id: 1 }; const result = await createAccount(testData); // 验证构造函数被正确调用,传参符合预期 expect(Account).toHaveBeenCalledWith(testData); // 验证返回结果符合预期 expect(result.user_id).toBe(testData.user_id); // 验证save方法被调用 expect(result.save).toHaveBeenCalled(); });
内容的提问来源于stack exchange,提问作者Đoàn Đức Bảo
相关产品推荐
相关产品推荐

