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:无法模拟 node.js 网络对象

如何在 Typescript 中使用 Sinon?

用 Sinon.js 模拟的对象不承认它们的方法通过 jQuery.delegate 回调执行

用 sinon 模拟/存根猫鼬 findById

如何使用 sinon js/loopback testlab 模拟来自 twilio-node 的 messages.create() 方法的返回值?