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];

此代码表示:

  1. 等待调用 client.query 返回的 Promise 并赋值 它到一个名为 results.
  2. 的变量
  3. results 是一个带有 属性 的对象 rows 这是一个 其第 0 个元素应为具有 counttimestamp 属性 - 我们将其解构为局部变量。

这意味着结果的值类似于:

{
  "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]
};