我正在尝试截取以下代码
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];
这个代码说:
- 等待调用返回的Promise到
client.query
并分配将其转换为一个名为CCD_ 4的变量 results
是一个名为rows
的属性的对象数组,其第0个元素应为具有count
和timestamp
属性-我们将其分解为局部变量
这意味着结果的值看起来像:
{
"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]
};