Как проверить несколько аргументов для нескольких вызовов шпионских шпионов?

У меня есть следующая функция в компоненте 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

Подпись .toHaveBeenCalledWith(arg1, arg2, ...), где arg1, arg2, ... означает один вызов (см.).

Если вы хотите протестировать несколько вызовов, просто expect это несколько раз.

К сожалению, я еще не нашел способ проверить порядок нескольких вызовов.

Ответ 2

Я смог выполнить несколько вызовов и проверить аргументы следующим образом:

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

где mockFn - ваше имя изделенной функции.

Ответ 4

Вы также можете проверить toHaveBeenCalledWith и протестировать несколько раз для каждой ожидаемой комбинации параметров.

В приведенном ниже примере проверяется, что GA был вызван три раза, включая три обязательных плагина.

  describe("requireDefaultGoogleAnalyticsPlugins", () => {
    it("requires defualt plugins", () => {
      requireDefaultGoogleAnalyticsPlugins(TRACKER);
      expect(GoogleAnalytics.analytics).toHaveBeenCalledTimes(3);
      expect(GoogleAnalytics.analytics).toHaveBeenCalledWith(
        '${TRACKER}.require', "linkid", "linkid.js"
      );
      expect(GoogleAnalytics.analytics).toHaveBeenCalledWith(
        '${TRACKER}.require', "displayfeatures"
      );
      expect(GoogleAnalytics.analytics).toHaveBeenCalledWith(
        '${TRACKER}.require', "ec"
      );
    });
  });

В случае OP вы можете проверить это с

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

Ответ 5

Это сработало и для меня... при начальной загрузке страницы выполняется поиск по умолчанию... взаимодействие с пользователем, а при поиске по кликам выполняется другой поиск... требуется для проверки того, что процесс поиска корректно увеличил значения поиска...

let model = {
        addressLine1: null,
        addressLine2: null,
        city: null,
        country: "US"};
let caModel = { ...model, country: "CA" };
const searchSpy = props.patientActions.searchPatient;
expect(searchSpy.mock.calls).toEqual([[{ ...model }], [{ ...caModel }]]);

Ответ 6

Еще одно решение, основанное на Анди. Выберите нужный вызов и проверьте значение аргументов. В этом примере выбран первый вызов:

expect(mockFn.mock.calls[0][0]).toEqual('first argument');
expect(mockFn.mock.calls[0][1]).toEqual('second argument');