3

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

我的功能:

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 个 db 调用的结果都等于最后一个 mock [7, 8, 9]。有人可以指导我如何正确模拟这三个电话吗?

先感谢您!

4

1 回答 1

1

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

有了它,您可以模拟给定参数集的特定返回。

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

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

于 2020-06-23T22:41:40.147 回答