如何用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
相关产品推荐
相关产品推荐

