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

