如何在一个单元测试中开玩笑地模拟多个不同的数据库调用?

How can I mock multiple different database calls in a unit test with jest?

我正在为调用多个不同数据库的函数编写一个有趣的单元测试。我能够很好地模拟第一个数据库调用,但我无法模拟其他人。

我的函数:

const sample = async () => {
   const resultsFromCallOne = await dbClient.makeCall('...');
   const resultsFromCallTwo = await dbClient.makeCall('...');
   const resultsFromCallThree = await dbClient.makeCall('...');
}

我的测试文件:

const mock = jest.spyOn(dbClient, 'makeCall');
mock.mockImplementation(() => Promise.resolve({
  return [1, 2, 3];
}));

mock.mockImplementation(() => Promise.resolve({
  return [4, 5, 6];
}));

mock.mockImplementation(() => Promise.resolve({
  return [7, 8, 9];
}));

sample();

当我 运行 测试时,所有 3 个数据库调用的结果都等于最后一个模拟 [7, 8, 9]。有人可以指导我如何正确模拟这三个调用吗?

提前致谢!

每个调用有不同的参数吗?如果是这样,我会推荐jest-when。 https://www.npmjs.com/package/jest-when

有了它,您可以为给定的参数集模拟出特定的 returns。

编辑以添加另一个选项。您可以利用 mockResolvedValueOncehttps://jestjs.io/docs/en/mock-function-api#mockfnmockresolvedvalueoncevalue

这将取代 return 承诺的需要,但会更脆弱,因为它取决于调用模拟的顺序。