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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:57:16