如何检查多个电话上的多个参数以寻找开玩笑的间谍?

我在 React 组件中有以下函数:

onUploadStart(file, xhr, formData) {
  formData.append('filename', file.name);
  formData.append('mimeType', file.type);
}

这是我的测试,至少可以调用间谍:

const formData = { append: jest.fn() };
const file = { name: 'someFileName', type: 'someMimeType' };
eventHandlers.onUploadStart(file, null, formData);

expect(formData.append).toHaveBeenCalledWith(
  ['mimeType', 'someMimeType'],
  ['fileName', 'someFileName']
);

但是,断言不起作用:

Expected mock function to have been called with:
 [["mimeType", "someMimeType"], ["fileName", "someFileName"]]
But it was called with:
  ["mimeType", "someMimeType"], ["filename", "someFileName"]

正确的使用方法是什么?toHaveBeenCalledWith


答案 1

我能够模拟多个调用并以这种方式检查参数:

expect(mockFn.mock.calls).toEqual([
  [arg1, arg2, ...], // First call
  [arg1, arg2, ...]  // Second call
]);

其中 是模拟函数名称。mockFn


答案 2

自开玩笑23.0以来,https://jestjs.io/docs/expect#tohavebeennthcalledwithnthcall-arg1-arg2-.toHaveBeenNthCalledWith(nthCall, arg1, arg2, ....)

别名下还有:.nthCalledWith(nthCall, arg1, arg2, ...)

如果你有一个模拟函数,你可以用它来测试它第n次调用的参数。例如,假设您有一个适用于一堆口味的函数,并且您希望确保当您调用它时,它操作的第一个口味是,第二个是 。你可以写:.toHaveBeenNthCalledWithdrinkEach(drink, Array<flavor>)f'lemon''octopus'

test('drinkEach drinks each drink', () => {
  const drink = jest.fn();
  drinkEach(drink, ['lemon', 'octopus']);
  expect(drink).toHaveBeenNthCalledWith(1, 'lemon');
  expect(drink).toHaveBeenNthCalledWith(2, 'octopus');
});

注意:第 n 个参数必须是从 1 开始的正整数。