首页 > 解决方案 > Sequelize findAll 在 sequelize-mock 上没有返回预期的输出

问题描述

我正在尝试使用 sequelize-mock 对我的 nodejs-express 方法进行单元测试。

控制器

const getDetailsByUserId = async (id) => {
        try {
            const userId = id ?? 0;
            const details = await Model.findAll(
                {
                    raw: true,
                    where: { user_id: userId  }
                }
            );
            
            if (details && details .length > 0) {
                return {
                    status: 200,
                    success: true,
                    message: 'details found.',
                    data: details 
                }
            }
    
            return {
                status: 404,
                success: false,
                message: 'details not found',
                data: []
            }
        } catch (error) {
            return {
                status: 500,
                success: false,
                message: error.message || "An error occurred while getting details.",
                data: null
            }
        }
    }

测试

jest.mock('../models/details', () => () => {
    const SequelizeMock = require("sequelize-mock");
    const dbMock = new SequelizeMock();
    return dbMock.define('users', [
        {
            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'
        }
    ]);
});

test('should return 404 and an empty array', async () => {
            const userId = 147;
            const details = await controller.getDetailsByUserId(userId);

            expect(details.status).toEqual(404);
        });

我总是在这里得到 200 而不是 404 的状态。我检查了返回的数据,它返回了定义的模拟模型的记录。

实际结果:

[
      fakeModelInstance {
        options: {
          timestamps: true,
          paranoid: undefined,
          createdAt: undefined,
          updatedAt: undefined,
          deletedAt: undefined,
          isNewRecord: true
        },
        _values: {
          '0': [Object],
          '1': [Object],
          '2': [Object],
          user_id: 147,
          id: 1,
          createdAt: 2021-09-18T00:55:25.976Z,
          updatedAt: 2021-09-18T00:55:25.976Z
        },
        dataValues: {
          '0': [Object],
          '1': [Object],
          '2': [Object],
          user_id: 147,
          id: 1,
          createdAt: 2021-09-18T00:55:25.976Z,
          updatedAt: 2021-09-18T00:55:25.976Z
        },
        hasPrimaryKeys: true,
        __validationErrors: []
      }
    ]

问题:

  1. 对于这种情况,我可以做些什么来获得预期的结果(空数组)?
  2. 被嘲笑时raw: true似乎不起作用。有没有办法可以在原始对象上记录结果?

注意:这只发生在单元测试中。在邮递员上访问端点时,它会返回预期的结果。

标签: mysqlnode.jsunit-testingmockingsequelize.js

解决方案


根据文档,findAll()将始终根据选项中的 where 查询返回单个结果的数组。这就是为什么你永远不会得到一个空数组的原因。

查看更多:https ://sequelize-mock.readthedocs.io/en/stable/api/model/#findalloptions-promisearrayinstance


推荐阅读