Wie überprüfe ich mehrere Argumente bei mehreren Anrufen auf Scherze?

Lesezeit: 4 Minuten

Benutzer-Avatar
Andreas Köberle

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, der zumindest den Spion dazu bringt, angerufen zu werden:

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 zu verwenden toHaveBeenCalledWith?

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

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

wo mockFn ist Ihr verspotteter Funktionsname.

  • das sollte die “beste antwort” sein

    – Toni Festauer

    27. Februar 2018 um 15:52 Uhr

  • Beachten Sie auch, dass Sie Dinge wie verwenden können, wenn Sie nicht genau wissen, wie die Parameter lauten sollten expect.objectContaining.

    – Hew Wolff

    30. November 2020 um 19:59 Uhr

  • Ich musste diese Syntax verwenden, damit es funktioniert: expect(mockFn.mock.calls.allArgs()).toEqual([ ...]);. Als Referenz verwende ich Jasmine Version 4.

    – Tudor Ciotlos

    13. Juli um 8:12 Uhr


  • Ich bin mir bewusst, dass toHaveBeenNthCalledWithwie in anderen Antworten erwähnt, aber ich denke, dass diese Lösung knapper und einfacher zu lesen ist.

    – Holf

    22. Juli um 16:55 Uhr


Benutzer-Avatar
mpetla

Seit jeher 23.0 gibt es das .toHaveBeenNthCalledWith(nthCall, arg1, arg2, ....) https://jestjs.io/docs/expect#tohavebeennthcalledwithnthcall-arg1-arg2-

Auch unter dem Alias: .nthCalledWith(nthCall, arg1, arg2, …)

Wenn Sie eine Mock-Funktion haben, können Sie diese verwenden .toHaveBeenNthCalledWith um zu testen, mit welchen Argumenten es aufgerufen wurde. Nehmen wir zum Beispiel an, Sie haben eine drinkEach(drink, Array<flavor>) Funktion, die gilt f zu einer Reihe von Geschmacksrichtungen, und Sie möchten sicherstellen, dass, wenn Sie es aufrufen, die erste Geschmacksrichtung ist, mit der es arbeitet 'lemon' und der zweite ist 'octopus'. Du kannst schreiben:

test('drinkEach drinks each drink', () => {
  const drink = jest.fn();
  drinkEach(drink, ['lemon', 'octopus']);
  expect(drink).toHaveBeenNthCalledWith(1, 'lemon');
  expect(drink).toHaveBeenNthCalledWith(2, 'octopus');
});

Hinweis: Das n-te Argument muss eine positive ganze Zahl beginnend bei 1 sein.

  • Während dieser Link bei Ihrer Antwort auf die Frage hilfreich sein kann, können Sie diese Antwort verbessern, indem Sie wichtige Teile des Links nehmen und in Ihre Antwort einfügen. Dadurch wird sichergestellt, dass Ihre Antwort immer noch eine Antwort ist, wenn der Link geändert oder entfernt wird 🙂

    – Was ist der Punkt

    30. Mai 2018 um 9:42 Uhr

  • Auch wenn in der Antwort kein Beispiel angegeben ist, ist dieser Punkt wirklich gültig! wie du willst!

    – Quirimmo

    30. August 2018 um 14:02 Uhr

Benutzer-Avatar
Lex

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

Ein Beispiel ist Google Analytics Plugin-API verwendet denselben Funktionsaufruf mit unterschiedlichen Parameterkombinationen.

function requireGoogleAnalyticsPlugins() {
  ...
  ga('create', 'UA-XXXXX-Y', 'auto');
  ga('require', 'localHitSender', {path: '/log', debug: true});
  ga('send', 'pageview');
}

Um dies zu testen, testet das folgende Beispiel dies ga wurde dreimal mit den verschiedenen Parameterkombinationen aufgerufen.

describe("requireGoogleAnalyticsPlugins", () => {
  it("requires plugins", () => {
    requireGoogleAnalyticsPlugins();
    expect(GoogleAnalytics.ga.toHaveBeenCalledTimes(3);
    expect(GoogleAnalytics.ga).toHaveBeenCalledWith('create', 'UA-XXXXX-Y', 'auto');
    expect(GoogleAnalytics.ga).toHaveBeenCalledWith('require', 'localHitSender', {path: '/log', debug: true});
    expect(GoogleAnalytics.ga).toHaveBeenCalledWith('send', 'pageview');
  });
});

Im OP-Fall könntest du das mit testen

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

Benutzer-Avatar
Enoah Nezach

Die Unterschrift ist .toHaveBeenCalledWith(arg1, arg2, ...)wo arg1, arg2, ... bedeutet in a Single Anruf (sehen).

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

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

Benutzer-Avatar
Kim Kern

Sie können auch ein Array der erwarteten Argumente pro Aufruf erstellen und es durchlaufen:

const expectedArgs = ['a', 'b', 'c', 'd']
expectedArgs.forEach((arg, index) => 
    expect(myFunc).toHaveBeenNthCalledWith(index + 1, arg))

Diese Lösung berücksichtigt die Reihenfolge der Aufrufe. Wenn Ihnen die Reihenfolge egal ist, können Sie verwenden toHaveBeenCalledWith ohne den Index stattdessen.

  • Dies überprüft die Reihenfolge der Aufrufe, nicht nur, ob sie alle stattgefunden haben (was erwünscht sein kann oder nicht). Aber ich bin schon angerufen worden mit will 1 wenn es den ersten Anruf überprüft, nicht 0also ist der Index um eins verschoben.

    – Jacob Raihle

    24. Juni 2020 um 9:09 Uhr

  • @JacobRaihle Danke für den Hinweis. 🙂 Ich habe die Antwort gemäß Ihrem Kommentar aktualisiert.

    – Kim Kern

    24. Juni 2020 um 9:17 Uhr

Benutzer-Avatar
Tonatio

Eine andere Lösung, die auf der von Andi basiert. Wählen Sie den gewünschten Aufruf 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

  • Dies überprüft die Reihenfolge der Aufrufe, nicht nur, ob sie alle stattgefunden haben (was erwünscht sein kann oder nicht). Aber ich bin schon angerufen worden mit will 1 wenn es den ersten Anruf überprüft, nicht 0also ist der Index um eins verschoben.

    – Jacob Raihle

    24. Juni 2020 um 9:09 Uhr

  • @JacobRaihle Danke für den Hinweis. 🙂 Ich habe die Antwort gemäß Ihrem Kommentar aktualisiert.

    – Kim Kern

    24. Juni 2020 um 9:17 Uhr

Benutzer-Avatar
serv-inc

Um die Anzahl der Mocks zurückzusetzen, können Sie anrufen jest.clearAllMocks.

Dies ist am nützlichsten in a beforeEach zwischen Prüfungen.

beforeEach(() => jest.clearAllMocks());

1245900cookie-checkWie überprüfe ich mehrere Argumente bei mehreren Anrufen auf Scherze?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy