web-dev-qa-db-fra.com

Plaisanter un objet à attendre (). ToBeCalledWith ()

J'utilise jest pour tester mes composants react et j'utilise expect(...).toBeCalledWith(...); pour tester si une fonction a été appelée avec des paramètres spécifiques, et cela fonctionne très bien avec les types de valeur.

Le problème est que je veux tester une fonction qui prend un objet en paramètre, donc lorsque vous appelez expect(myFunc).toBeCalledWith(object); le test échoue toujours car bien sûr les deux objets comparés n'ont pas la même référence.

alors comment puis-je résoudre ce problème?

un exemple de code de ce que j'essaie de tester est

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

Un message d'erreur ressemblerait à ceci

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

Mise à jour

il semble que le code ci-dessous fonctionne bien

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

cependant, si l'objet contient une propriété avec une valeur de tableau, la solution ci-dessus ne fonctionne pas

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

Regarder le doc jest ( https://facebook.github.io/jest/docs/en/expect.html#expectobjectcontainingobject ). Il semble que vous puissiez faire quelque chose comme ceci:

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