Как проверить несколько аргументов для нескольких вызовов шпионских шпионов?
У меня есть следующая функция в компоненте 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
- ваше имя изделенной функции.
Ответ 3
Начиная с .toHaveBeenNthCalledWith(nthCall, arg1, arg2,....)
23.0, существует .toHaveBeenNthCalledWith(nthCall, arg1, arg2,....)
https://facebook.github.io/jest/docs/en/expect.html#tohavebeennthcalledwithnthcall-arg1-arg2-
Ответ 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');