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

sequelize-mock单元测试findAll返回值与raw参数不生效问题咨询

问题解决方法

1、实现按where条件过滤返回空数组

sequelize-mock 默认不会自动解析处理findAll传入的where参数,无论查询条件是什么,默认都会返回你define阶段传入的全部模拟数据,这就是你查询不存在的userId依然返回全部记录的根本原因。
你需要手动重写模型的findAll方法,自行实现查询条件过滤逻辑,修改你的jest mock代码如下:

jest.mock('../models/details', () => () => {
    const SequelizeMock = require("sequelize-mock");
    const dbMock = new SequelizeMock();
    const mockData = [
        {
            id: 1,
            user_id: 123,
            name: 'John Doe 1'
        },
        {
            id: 2,
            user_id: 456,
            name: 'John Doe 2'
        },
        {
            id: 3,
            user_id: 789,
            name: 'John Doe 3'
        }
    ];
    const ModelMock = dbMock.define('users', mockData);
    // 重写findAll方法,自行处理查询逻辑
    ModelMock.findAll = async function (options = {}) {
        const where = options.where || {};
        // 按where条件过滤模拟数据
        let filteredData = [...mockData];
        if (where.user_id !== undefined) {
            filteredData = filteredData.filter(item => item.user_id === where.user_id);
        }
        // 处理raw参数
        if (options.raw) {
            return filteredData;
        }
        // 非raw模式返回模拟实例,保持默认行为兼容
        return filteredData.map(item => ModelMock.build(item));
    }
    return ModelMock;
});

修改后查询userId=147时,过滤后的结果为空数组,就会命中你代码里404的分支,符合预期。

2、解决raw: true不生效的问题

sequelize-mock 原生没有实现raw参数的适配逻辑,所以即使你传了raw: true,默认还是会返回封装后的fakeModelInstance实例对象。
上面给出的重写findAll的代码里已经加入了raw参数的处理逻辑:当检测到传入raw: true时,直接返回过滤后的原始对象数组,和真实Sequelize的行为保持一致,不需要你再做额外转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:24:03