Sinon存根-模拟一个返回对象数组的函数



我正在尝试截取以下代码

async function logUpdate(client) {
const results = await client.query(query.toParam());
const { count, timestamp } = results.rows[0];
await db.updateDatasourceLogs(destdb, DB.src, TABLES.src, timestamp, count);
}

这是下面的代码,我正在使用存根上面的代码

fakeClient = {
query: sinon.stub().resolves(fakeRows),
};
const rowData = {
count: 1,
timestamp: ''
};
fakeRows = {
rows: sinon.stub().returns([rowData]),
};
fakeSequel = {
useFlavour: sinon.stub().returns(toParam: () => false,),
};

我收到一个破坏的错误

TypeError:无法析构"undefined"或"null"的属性count

在线

const { count, timestamp } = results.rows[0];

如何截断上述行

如果我们查看logUpdate函数的主体,我们会发现它以以下两行开头:

const results = await client.query(query.toParam());
const { count, timestamp } = results.rows[0];

这个代码说:

  1. 等待调用返回的Promise到client.query并分配将其转换为一个名为CCD_ 4的变量
  2. results是一个名为rows的属性的对象数组,其第0个元素应为具有counttimestamp属性-我们将其分解为局部变量

这意味着结果的值看起来像:

{
"rows": [
{
"count": 1
"timestamp": "0"
}
]
}

然而,在我们的存根代码中,我们有以下内容:

fakeRows = {
rows: sinon.stub().returns([rowData]),
};

它说fakeRows是一个具有rows属性的对象,其值返回[rowData]的函数

如果我们在没有sinon的情况下实现这个对象,它看起来像:

{
"rows": function () {
return [
{
"count": 1
"timestamp": "0"
}
];
}
}

请注意logUpdate所期望的结构与fakeRows实际提供的结构之间的差异。具体来说,logUpdate期望results具有rows数组,但是,使用我们的存根代码,它具有rows函数

我们可以通过让fakeRows直接引用我们的rowData来解决这个问题:

const fakeRows = {
rows: [rowData]
};

相关内容

  • 没有找到相关文章

最新更新