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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:51:00