Sequelize Mock搭配Sequelize的count函数使用无法正常工作如何解决?
结论
你的猜测完全正确,该问题就是因为Sequelize Mock无法模拟sequelize.fn('count')的聚合计算逻辑导致的。
问题原因
Sequelize Mock的设计定位是返回人工预设的模拟数据,本身不会解析、执行Sequelize内置的函数逻辑,也不会真的根据查询参数做聚合运算。你代码中通过fn定义的count聚合字段,在未手动配置返回值的情况下,Sequelize Mock返回的结果中该字段值为undefined,parseInt(undefined, 10)的执行结果就是NaN,最终导致你解构得到的active、in-progress值都是NaN。
修复方案
- 直接给对应模型的
findAll方法预设返回结果即可解决,示例如下:
// 在执行查询前先配置模拟返回数据 ImmediateCare.$queueResult([ { status: 'active', count: '5' }, // 可以直接传数字也可以传字符串格式的数值 { status: 'in-progress', count: '3' } ]) // 再执行你的原有查询逻辑,就能拿到预期的count值 const { active, 'in-progress': inProgress, } = await ImmediateCare.findAll({ raw: true, attributes: ['status', [fn('count', col('id')), 'count']], group: ['ImmediateCare.status'], }).then((status) => { const counts = { active: 0, 'in-progress': 0, } status.forEach((s) => { counts[s.status] = parseInt(s.count, 10) }) return counts })
- 如果不需要测试查询逻辑本身,也可以直接构造符合格式的
counts对象传入后续业务逻辑做测试。
内容的提问来源于stack exchange,提问作者hoffman
相关产品推荐
相关产品推荐

