首页 > 解决方案 > 如何使 Jest spOn 第二次调用函数

问题描述

我有嵌套的 Postgres 查询。因此,当我测试时,我希望 Jest.spyOn 以不同的响应解决

const query1 = 'SELECT NOW() as now'
const query2 = 'SELECT * from table1'

return new Promise((resolve, reject) => {
    pgClient
      .query(query1)
      .then(res => {
        pgClient
          .query(query2)
          .then(res => {
            resolve(res.rows[0])
          })
          .catch(e => reject(e.stack))
      })
      .catch(e => reject(e.stack))
});

所以我的测试看起来像:

  jest.spyOn(pgClient, 'query').mockImplementation(() =>
    Promise.resolve({ rows: [...] })
  );

那么如何在同一个测试中解决 query1 和 query2 不同的响应呢?

标签: javascriptnode.jsunit-testingjestjs

解决方案


根据传递给它的参数,您可以mockImplementation返回不同的响应:

jest.spyOn(pgClient, "query").mockImplementation(query => {
  if (query === query1) {
    return Promise.resolve({ rows: [1] });
  } else if (query === query2) {
    return Promise.resolve({ rows: [2] });
  }
  return Promise.resolve({ rows: [] });
});

演示


推荐阅读