web-dev-qa-db-fra.com

Comment vérifier plusieurs arguments sur plusieurs appels d'espionnage?

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?

17
Andreas Köberle

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
]);

mockFn est le nom de votre fonction fictive.

51
Andi

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.

6
Enoah Netzach

Depuis la version 23.0, il y a .toHaveBeenNthCalledWith(nthCall, arg1, arg2, ....)https://facebook.github.io/jest/docs/en/expect.html#tohavebeennthcalledwithnthcall-arg1-arg2-

6
mpetla

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');
2
Lex

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 }]]);
0
swandog

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:

https://devhints.io/jest

0
Tonatio