J'ai la fonction suivante dans un composant React:
onUploadStart(file, xhr, formData) {
formData.append('filename', file.name);
formData.append('mimeType', file.type);
}
Voici mon test qui permet au moins à l'espion d'être appelé:
const formData = { append: jest.fn() };
const file = { name: 'someFileName', type: 'someMimeType' };
eventHandlers.onUploadStart(file, null, formData);
expect(formData.append).toHaveBeenCalledWith(
['mimeType', 'someMimeType'],
['fileName', 'someFileName']
);
Cependant, l'assertion ne fonctionne pas:
Expected mock function to have been called with:
[["mimeType", "someMimeType"], ["fileName", "someFileName"]]
But it was called with:
["mimeType", "someMimeType"], ["filename", "someFileName"]
Quelle est la bonne façon d'utiliser toHaveBeenCalledWith
?
J'ai pu simuler plusieurs appels et vérifier les arguments de cette façon:
expect(mockFn.mock.calls).toEqual([
[arg1, arg2, ...], // First call
[arg1, arg2, ...] // Second call
]);
où mockFn
est le nom de votre fonction fictive.
La signature est .toHaveBeenCalledWith(arg1, arg2, ...)
, où arg1, arg2, ...
signifie un appel unique ( voir ).
Si vous voulez tester plusieurs appels, il suffit de expect
plusieurs fois.
Malheureusement, je n'ai pas encore trouvé de méthode pour tester l'ordre des appels multiples.
Depuis la version 23.0, il y a .toHaveBeenNthCalledWith(nthCall, arg1, arg2, ....)
https://facebook.github.io/jest/docs/en/expect.html#tohavebeennthcalledwithnthcall-arg1-arg2-
Vous pouvez également tester toHaveBeenCalledWith
et tester plusieurs fois pour chaque combinaison de paramètres attendus.
L'exemple ci-dessous teste que GA a été appelé trois fois, y compris les trois plugins requis.
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"
);
});
});
Au cas où vous pourriez tester cela avec
expect(formData.append).toHaveBeenCalledWith('mimeType', 'someMimeType');
expect(formData.append).toHaveBeenCalledWith('fileName', 'someFileName');
Cela a également fonctionné pour moi ... le chargement initial de la page effectue une recherche par défaut ... une interaction utilisateur et un clic sur la recherche effectue une autre recherche ... nécessaire pour vérifier que le processus de recherche a correctement augmenté les valeurs de recherche ...
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 }]]);
Une autre solution basée sur celle d'Andi. Sélectionnez l'appel que vous voulez et vérifiez la valeur des arguments. Dans cet exemple, le premier appel est sélectionné:
expect(mockFn.mock.calls[0][0]).toEqual('first argument');
expect(mockFn.mock.calls[0][1]).toEqual('second argument');
Je recommande de vérifier cette aide-mémoire Jest: