【问题标题】:Sinon stub - mocking a function which returns an array of objectsSinon stub - 模拟一个返回对象数组的函数
【发布时间】: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];

如何存根上面的行?

【问题讨论】:

    标签: javascript unit-testing mocking sinon


    【解决方案1】:

    如果我们查看您的 logUpdate 函数的主体,我们会看到它以以下两行开头:

    const results = await client.query(query.toParam());
    const { count, timestamp } = results.rows[0];
    

    这段代码说:

    1. 等待调用client.query返回的Promise并分配 它到一个名为results的变量。
    2. 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]
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-23
      • 2017-07-23
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 2019-05-07
      • 2016-12-15
      • 1970-01-01
      相关资源
      最近更新 更多