mysql - 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: []
}
]
问题:
- 对于这种情况,我可以做些什么来获得预期的结果(空数组)?
- 被嘲笑时
raw: true
似乎不起作用。有没有办法可以在原始对象上记录结果?
注意:这只发生在单元测试中。在邮递员上访问端点时,它会返回预期的结果。
解决方案
根据文档,findAll()
将始终根据选项中的 where 查询返回单个结果的数组。这就是为什么你永远不会得到一个空数组的原因。
查看更多:https ://sequelize-mock.readthedocs.io/en/stable/api/model/#findalloptions-promisearrayinstance