webentwicklung-frage-antwort-db.com.de

Wie prüfe ich mehrere Argumente bei mehrfachen Aufrufen auf Scherzspione?

Ich habe die folgende Funktion in einer React-Komponente:

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

Dies ist mein Test, bei dem zumindest der Spion gerufen wird: 

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

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

Die Behauptung funktioniert jedoch nicht:

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

Was ist der richtige Weg, um toHaveBeenCalledWith zu verwenden?

17

Ich konnte mehrere Anrufe simulieren und die Argumente auf diese Weise überprüfen:

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

dabei ist mockFn Ihr nachgesetzter Funktionsname.

51
Andi

Die Signatur lautet .toHaveBeenCalledWith(arg1, arg2, ...), wobei arg1, arg2, ... in einem single - Aufruf ( siehe ) steht.

Wenn Sie mehrere Anrufe testen möchten, expect einfach mehrere Male.

Leider habe ich noch keine Methode gefunden, um die Reihenfolge mehrerer Anrufe zu testen.

6
Enoah Netzach

Seit jest 23.0 gibt es .toHaveBeenNthCalledWith(nthCall, arg1, arg2, ....)https://facebook.github.io/jest/docs/de/expect.html#tohavebeennthcalledwithnthcall-arg1-arg2-

6
mpetla

Sie können auch toHaveBeenCalledWith und mehrere Male für jede erwartete Parameterkombination testen.

Im folgenden Beispiel wird getestet, dass GA dreimal aufgerufen wurde, einschließlich drei erforderlicher Plugins.

  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"
      );
    });
  });

Im OP-Fall könnten Sie dies mit testen

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

Dies funktionierte auch für mich ... Das Laden der ersten Seite führt zu einer Standard-Suche ... Benutzerinteraktion und Klick-Suche führt zu einer anderen Suche ..., um zu überprüfen, ob der Suchvorgang die Suchwerte korrekt erhöht hat ...

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

Eine andere Lösung basierend auf Andi. Wählen Sie den gewünschten Anruf aus und überprüfen Sie den Wert der Argumente. In diesem Beispiel wird der erste Anruf ausgewählt:

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

Ich empfehle dieses Jest Cheatsheet zu überprüfen:

https://devhints.io/jest

0
Tonatio