¿Cómo puedo probar la igualdad de claves y valores de objetos usando Jest?

2 minutos de lectura

avatar de usuario de fasenberg
Fasenberg

tengo un mapModule donde importo componentes y los exporto:

import ComponentName from '../components/ComponentName';

export default {
  name: ComponentName,
};

como puedo probar eso mapModule tiene las claves exportadas correctas, los valores y que no son nulos o indefinidos?

En la versión 23.3.0 de broma,

expect(string).toMatch(string) 

espera una cadena.

Usar:

const expected = { name:'component name' }
const actual = { name: 'component name', type: 'form' }
expect(actual).toMatchObject(expected)

el resultado es pasar la prueba

avatar de usuario de toufek khoury
toufek khoury

puedes usar uno de esos:

toEqual y toMatchObject son comparadores de plantillas para objetos:

let Obj = {name: 'component name', id: 2};
expect(oneObj).toEqual({name: 'component name'}) // false, should be exactly equal all Obj keys and values  
expect(oneObj).toMatchObject({name: 'component name'}) // true

o use fácilmente toHaveProperty :

let Obj = {name: 'component name'};
expect(oneObj).toHaveProperty('name') // true
expect(oneObj).toHaveProperty('name', 'component name') // true

  • .toHaveProperty es lo que estaba buscando! Gracias

    – KJ Sudarshan

    2 de septiembre de 2021 a las 7:52

  • Tenemos que agregar los nombres de las propiedades dentro de una matriz

    – Codedeyya

    3 ene a las 23:53

  • obtener expect(…).toMatchObject no es un error de función

    –Sri Vineeth

    14 de febrero a las 15:15

avatar de usuario de rtorres
torres

Manten eso en mente .toMatchObject cheques

“que un objeto de JavaScript coincide con un subconjunto de las propiedades de un objeto”.

Asi que toMatchObject puede tener afirmaciones no intencionadas como:

expect({ a: 1, b: 2 }).toMatchObject({ a: 1 }); // pass

Si desea hacer coincidir un objeto exactamente, debe usar .toStrictEqualdisponible desde jest 23:

expect({ a: 1, b: 2 }).toStrictEqual({ a: 1 }); // fail

  • En realidad, esa es exactamente la afirmación para la que está diseñado MatchObject. Puedes usar toEqual si no quieres ese comportamiento…

    – Dan

    29 oct 2020 a las 19:40

  • Esta respuesta realmente debería ser la solución preferida para la mayoría de los casos.

    – mikemaccana

    9 de marzo de 2021 a las 19:49

Solo agregando este consejo, pensé que le dio una granularidad aún mejor a mis propias pruebas, especialmente al comparar argumentos con servicios simulados:

expect.objectContaining({
   url: expect.stringContaining('https://'),
})

Alternativamente, puede usar expresiones regulares con expect.stringMatching que prueba la expresión regular dada contra el valor. Con buena pinta.

expect.stringContaining
expect.stringMatching

Para una sola clave, puede consultar

expect(Boolean(obj[prop])).toBe(true | false);

Para clave múltiple (donde todos deben estar presentes) puede usar,

expect(Boolean(obj[prop1]) && Boolean(obj[prop2])).toBe(true | false);

Para clave múltiple (donde cualquiera debe estar presente) puede usar

expect(Boolean(obj[prop1]) || Boolean(obj[prop2])).toBe(true | false);

avatar de usuario de beeinger
beeinger

Otra forma es:

expect(JSON.stringify(object)).toBe(JSON.stringify(object))

Esto asegurará que los objetos sean iguales.

Sin embargo usando esto:

expect(object).toMatchObject(object)

es la mejor opción en la mayoría de los casos.

¿Ha sido útil esta solución?