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'
}
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'
},
);
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'
})
);
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.4
y 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