Sinon stub - 模拟一个返回对象数组的函数
Posted
技术标签:
【中文标题】Sinon stub - 模拟一个返回对象数组的函数【英文标题】:Sinon stub - mocking a function which returns an array of objects 【发布时间】:2021-12-11 09:49:26 【问题描述】:我正在尝试存根以下代码
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:无法解构“未定义”或“空”的属性count
。
一行
const count, timestamp = results.rows[0];
如何存根上面的行?
【问题讨论】:
【参考方案1】:如果我们查看您的 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
属性的对象,其值是一个函数,返回[rowData]
。
如果我们在没有 sinon 的情况下实现这个 Object,它看起来像:
"rows": function ()
return [
"count": 1
"timestamp": "0"
];
注意logUpdate
所期望的结构与fakeRows
实际提供的结构之间的区别。具体来说,logUpdate
期望 results
有一个 rows
数组,但是,对于我们的存根代码,它有一个 rows
函数!
我们可以通过让fakeRows
直接引用我们的rowData
来解决这个问题:
const fakeRows =
rows: [rowData]
;
【讨论】:
以上是关于Sinon stub - 模拟一个返回对象数组的函数的主要内容,如果未能解决你的问题,请参考以下文章
Backbone jasmine sinon.stub typeError
用 Sinon.js 模拟的对象不承认它们的方法通过 jQuery.delegate 回调执行
如何使用 sinon js/loopback testlab 模拟来自 twilio-node 的 messages.create() 方法的返回值?