NestJs中使用Jest模拟Objection Model依赖遇阻求助
解决NestJS中使用Jest Mock nestjs-objection模型的问题
针对你遇到的两个核心问题,这里给出具体的解决方案:
1. 正确使用getObjectionModelToken解决连接参数报错
当你用@InjectModel(User)注入模型时,nestjs-objection默认会用**模型类+默认连接名'default'**生成注入token。之前报错要求传入connection参数,是因为你没有显式指定默认连接名,只需补充第二个参数即可:
provide: getObjectionModelToken(User, 'default'),
这样既符合框架默认的注入规则,也不会触发路径相关的错误。
2. 完整Mock模型的链式调用逻辑
你的mock值是空对象,调用query().insert()必然会报错,需要模拟出Objection模型的链式调用结构:
{ provide: getObjectionModelToken(User, 'default'), useValue: { query: jest.fn().mockReturnThis(), // 模拟query()返回自身,支持链式调用 insert: jest.fn().mockResolvedValue({ email: 'mockEmail@mock.com', userName: 'user', pin: '123456' // 模拟返回包含pin的用户数据 }) } }
3. 修复模块路径不一致问题
你的测试文件中导入路径混乱(比如UsersService用../src/users/,CreateUserDto用src/users/),统一使用相对路径即可,不会影响应用正常功能:
- 如果测试文件和业务文件在同一目录(
src/users/下),直接用相对路径导入:import { UsersService } from './users.service'; import { CreateUserDto } from './create-user.dto'; import { User } from '../app.models';
修改后的完整测试代码
import { Test, TestingModule } from "@nestjs/testing"; import { UsersService } from "./users.service"; import { CreateUserDto } from "./create-user.dto"; import { User } from "../app.models"; import { getObjectionModelToken } from 'nestjs-objection'; describe('userService', () => { let userService: UsersService; let mockUserModel: typeof User; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ UsersService, { provide: getObjectionModelToken(User, 'default'), useValue: { query: jest.fn().mockReturnThis(), insert: jest.fn().mockResolvedValue({ email: 'mockEmail@mock.com', userName: 'user', pin: '123456' }) } }, ], }).compile(); userService = module.get<UsersService>(UsersService); mockUserModel = module.get(getObjectionModelToken(User, 'default')); }); it('Should be defined', () => { expect(userService).toBeDefined(); }); it('Should add pin to a created user', async () => { const createUserDTO: CreateUserDto = { email: 'mockEmail@mock.com', userName: 'user' }; const res = await userService.create(createUserDTO); expect(mockUserModel.query).toHaveBeenCalled(); expect(mockUserModel.query().insert).toHaveBeenCalledWith(createUserDTO); expect(res).toHaveProperty('pin'); expect(res.pin).toBe('123456'); }); });
内容的提问来源于stack exchange,提问作者Carlos Figueroa
相关产品推荐
相关产品推荐

