Übergeben Sie im Scherz ein Objekt an Expect().toBeCalledWith()

Lesezeit: 2 Minuten

Benutzeravatar von Nader Hisham
Nader Hischam

Ich verwende Scherz, um meine Reaktionskomponenten zu testen, und ich verwende expect(...).toBeCalledWith(...); um zu testen, ob eine Funktion mit bestimmten Parametern aufgerufen wurde und mit Werttypen gut funktioniert.

Das Problem ist, ich möchte eine Funktion testen, die beim Aufrufen ein Objekt als Parameter verwendet expect(myFunc).toBeCalledWith(object); Der Test schlägt immer fehl, weil die beiden miteinander verglichenen Objekte natürlich nicht die gleiche Referenz haben.

also wie kann ich dieses problem lösen?

ein Beispielcode dessen, was ich zu testen versuche, ist

it('the function should be called with the correct object', () => {
    api.submitForm = jest.fn().mockReturnValue(Promise.resolve());
    const wrapper = shallow(<component />);
    const instance = wrapper.instance();
    instance.submitForm();
    const object = {
      foo : 'foo',
      bar: 'bar'
    };
    // this always fails even the function is called with the same object values
    expect(api.submitForm).toBeCalledWith(object);
  });

Eine Fehlermeldung würde etwa so aussehen

Expected mock function to have been called with:
      [{"bar": "bar", "foo": "foo"}]
    But it was called with:
      [{"bar": "bar", "foo": "foo"}]

Aktualisieren

Es scheint, dass der folgende Code gut funktioniert

  expect(api.submitForm).toBeCalledWith(
    expect.objectContaining({
     foo : 'foo',
      bar: 'bar'
    }),
  );

Wenn das Objekt jedoch eine Eigenschaft mit Array-Wert enthält, funktioniert die obige Lösung nicht

const obj = {
  foo : ['foo1', 'foo2'],
  bar: 'bar'
}

  • Das Problem könnte etwas anderes sein. Ich habe das obige Muster in meinem Code verwendet und es funktioniert wie erwartet

    – Pubudu Dodangoda

    23. Dezember 2017 um 14:39 Uhr

  • Erwähnen Sie bitte die Scherzversion …

    – Pubudu Dodangoda

    23. Dezember 2017 um 14:41 Uhr

  • Das Scherzdokument selbst hier zeigt, dass sie den Wert vergleichen, nicht die Referenz, facebook.github.io/jest/docs/en/…

    – Pubudu Dodangoda

    23. Dezember 2017 um 14:50 Uhr


  • Ich benutze Scherz 20.0.4und das Problem tritt auf, wenn Sie eine Array-Eigenschaft in Ihrem Objekt haben

    – Nader Hischam

    23. Dezember 2017 um 15:02 Uhr

  • Die zweite Lösung funktioniert jetzt Ich habe einen Tippfehler in meinem Code entdeckt.

    – Nader Hischam

    23. Dezember 2017 um 15:06 Uhr

Wenn ich mir das Jest-Dokument ansehe (https://facebook.github.io/jest/docs/en/expect.html#expectobjectusingobject). Es scheint, dass Sie so etwas tun können:

 expect(api.submitForm).toBeCalledWith(
    expect.objectContaining({
     foo : 'foo',
      bar: 'bar'
    }),
  );

  • Das würde funktionieren. Aber die eigentliche Absicht von Expect.objectContaining ist etwas anders

    – Pubudu Dodangoda

    23. Dezember 2017 um 14:43 Uhr

  • das funktioniert eigentlich gut, aber das Problem, wenn Ihr Objekt eine Array-Eigenschaft enthält

    – Nader Hischam

    23. Dezember 2017 um 15:00 Uhr

  • Mann, ich liebe gute Dokumentation! Vielen Dank [jest] Mannschaft!

    – tim.rohrer

    2. Mai um 20:59 Uhr


Sie können verwenden .mock.calls[callIdx][paramIdx]

Beschreibung + Beispiel: https://stackoverflow.com/a/41939921/2519073

in Ihrem Fall

expect(api.submitForm.mock.calls[0][0]).toMatchObject( // use whatever matcher you want
    {
      foo : ['foo1', 'foo2'],
      bar: 'bar'
    },
  );

Benutzeravatar von vanduc1102
vanduc1102

Falls Sie Ihre Funktion mit Argumenten aufrufen

function update( userId, partialUserObject ){
   // update logic
}

Sie können verwenden

expect(update).toBeCalledWith('mockUserId',
   expect.objectContaining({
     username:'hello-world',
     displayName: 'Hello World'
   })
);

1434380cookie-checkÜbergeben Sie im Scherz ein Objekt an Expect().toBeCalledWith()

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

Privacy policy