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

如何用Jest Mock Sequelize模型?初始化报错求解决

解决Sequelize模型Mock时的"No Sequelize instance passed"报错

问题原因

使用jest.mock('src/Users/UserModel')时,Jest的自动mock机制会加载原模块代码,触发User.init()执行,但测试环境中没有提供有效的Sequelize实例,因此抛出错误。

两种可行解决方案

方案一:手动Mock模型模块,跳过init执行

用Jest的mock工厂函数直接替换整个模型模块,返回仅包含测试所需方法的mock对象,原模块的init代码不会被执行:

// 替换原有的jest.mock调用
jest.mock('src/Users/UserModel', () => ({
  create: jest.fn()
}));

const User = require('src/Users/UserModel');
const UsersService = require('src/Users/UserService');

describe('UsersService', () => {
  it('创建用户', async () => {
    User.create.mockResolvedValue({ id: 'mock-user-uuid' });
    const mockUser = {
      firstName: 'mock first',
      lastName: 'mock last',
    };
    const result = await UsersService.createUser(mockUser);
    expect(result).toEqual({ ...mockUser, id: 'mock-user-uuid' });
    // 可选:验证create方法是否被正确调用
    expect(User.create).toHaveBeenCalledWith(mockUser);
  });
});

方案二:Mock数据库配置,提供有效Sequelize实例

如果需要保留模型结构(比如测试依赖模型的其他属性),可以mock数据库配置模块,返回一个内存版Sequelize实例,让User.init()正常执行:

// 先mock数据库配置
jest.mock('../../lib/db/config', () => {
  const { Sequelize } = require('sequelize');
  // 使用SQLite内存数据库,无需实际连接
  return new Sequelize('sqlite::memory:');
});

// 正常mock模型模块
jest.mock('src/Users/UserModel');

const User = require('src/Users/UserModel');
const UsersService = require('src/Users/UserService');

describe('UsersService', () => {
  it('创建用户', async () => {
    User.create.mockResolvedValue({ id: 'mock-user-uuid' });
    const mockUser = {
      firstName: 'mock first',
      lastName: 'mock last',
    };
    const result = await UsersService.createUser(mockUser);
    expect(result).toEqual({ ...mockUser, id: 'mock-user-uuid' });
  });
});

补充说明

如果UsersService依赖模型的其他静态方法(如findOne、update),只需在mock对象中添加对应的jest.fn()即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:47:53