Sinon 存根 - 模拟一个 returns 对象数组的函数
Sinon stub - mocking a function which returns an array of objects
我正在尝试存根以下代码
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];
此代码表示:
- 等待调用
client.query
返回的 Promise 并赋值
它到一个名为 results
. 的变量
results
是一个带有 属性 的对象 rows
这是一个
其第 0 个元素应为具有 count
且
timestamp
属性 - 我们将其解构为局部变量。
这意味着结果的值类似于:
{
"rows": [
{
"count": 1
"timestamp": "0"
}
]
}
但是,在我们的存根代码中,我们有以下内容:
fakeRows = {
rows: sinon.stub().returns([rowData]),
};
这表示 fakeRows
是一个具有 rows
属性 的对象,其值 是一个 的函数 returns [rowData]
.
如果我们在没有 sinon 的情况下实现这个对象,它看起来像:
{
"rows": function () {
return [
{
"count": 1
"timestamp": "0"
}
];
}
}
请注意 logUpdate
期望的结构与 fakeRows
实际提供的结构之间的差异。具体来说,logUpdate
期望 results
有一个 rows
数组 ,但是,对于我们存根的代码,它有一个 rows
函数!
我们可以通过让 fakeRows
直接引用我们的 rowData
来解决这个问题:
const fakeRows = {
rows: [rowData]
};
我正在尝试存根以下代码
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];
此代码表示:
- 等待调用
client.query
返回的 Promise 并赋值 它到一个名为results
. 的变量
results
是一个带有 属性 的对象rows
这是一个 其第 0 个元素应为具有count
且timestamp
属性 - 我们将其解构为局部变量。
这意味着结果的值类似于:
{
"rows": [
{
"count": 1
"timestamp": "0"
}
]
}
但是,在我们的存根代码中,我们有以下内容:
fakeRows = {
rows: sinon.stub().returns([rowData]),
};
这表示 fakeRows
是一个具有 rows
属性 的对象,其值 是一个 的函数 returns [rowData]
.
如果我们在没有 sinon 的情况下实现这个对象,它看起来像:
{
"rows": function () {
return [
{
"count": 1
"timestamp": "0"
}
];
}
}
请注意 logUpdate
期望的结构与 fakeRows
实际提供的结构之间的差异。具体来说,logUpdate
期望 results
有一个 rows
数组 ,但是,对于我们存根的代码,它有一个 rows
函数!
我们可以通过让 fakeRows
直接引用我们的 rowData
来解决这个问题:
const fakeRows = {
rows: [rowData]
};