Bromea pasando un objeto a expect().toBeCalledWith()

3 minutos de lectura

Avatar de usuario de Nader Hisham
Nader Hisham

Estoy usando broma para probar mis componentes de reacción y estoy usando expect(...).toBeCalledWith(...); para probar si una función ha sido llamada con parámetros específicos y funciona bien con tipos de valor.

El problema es que quiero probar una función que toma un objeto como parámetro, así que cuando llamas expect(myFunc).toBeCalledWith(object); la prueba siempre falla porque, por supuesto, los dos objetos comparados entre sí no tienen la misma referencia.

Entonces, ¿cómo puedo resolver este problema?

un código de muestra de lo que estoy tratando de probar es

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 mensaje de error sería algo como esto

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

Actualizar

parece que el siguiente código funciona bien

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

sin embargo, si el objeto contiene una propiedad con valor de matriz, la solución anterior no funciona

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

  • El problema podría ser otro. He usado el patrón anterior en mi código y funciona como se esperaba

    –Pubudu Dodangoda

    23 de diciembre de 2017 a las 14:39

  • Menciona la versión en broma por favor…

    –Pubudu Dodangoda

    23 de diciembre de 2017 a las 14:41

  • El documento de broma en sí mismo aquí muestra que están comparando el valor, no la referencia, facebook.github.io/jest/docs/en/…

    –Pubudu Dodangoda

    23 de diciembre de 2017 a las 14:50


  • estoy usando broma 20.0.4y el problema ocurre si tiene una propiedad de matriz en su objeto

    – Nader Hisham

    23 de diciembre de 2017 a las 15:02

  • la segunda solución funciona ahora que descubrí un error tipográfico en mi código.

    – Nader Hisham

    23 de diciembre de 2017 a las 15:06

Mirando el doc broma (https://facebook.github.io/jest/docs/en/expect.html#expectobjectcontainingobject). Parece que puedes hacer algo como esto:

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

  • Esto funcionaría. Pero la intención real de expect.objectContaining es ligeramente diferente

    –Pubudu Dodangoda

    23 de diciembre de 2017 a las 14:43

  • esto funciona bien en realidad, pero el problema si su objeto contiene una propiedad de matriz

    – Nader Hisham

    23 dic 2017 a las 15:00

  • ¡Hombre, me encanta la buena documentación! Gracias [jest] ¡equipo!

    – tim.rohrer

    2 de mayo a las 20:59


puedes usar .mock.calls[callIdx][paramIdx]

descripción + ejemplo: https://stackoverflow.com/a/41939921/2519073

en tu caso

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

avatar de usuario de vanduc1102
vanduc1102

En caso de que su función sea llamada con argumentos

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

Puedes usar

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

¿Ha sido útil esta solución?