Funciones de utilidades compartidas para probar con Jest

5 minutos de lectura

Avatar de usuario de Andrea
Andrea

Tengo algunas funciones útiles que estoy usando entre varias pruebas de Jest, por ejemplo, una función como esta, para burlarse de una respuesta de búsqueda:

export const mockFetchJsonResponse = (data) => {
    ok: () => true,
    json: () => data
};

Me gustaría compartir esas funciones de manera que pueda importarlas y reutilizarlas entre mis pruebas. Por ejemplo:

// Some .spec.jsx file
// ...
import {mockFetchJsonResponse} from 'some/path/to/shared/tests/utils.jsx'

// Then I can use mockFetchJsonResponse inside this test
// ...

¿Dónde debo colocar tales funciones útiles comunes?

La carpeta de mi proyecto se ve así:

components/
    CompOne/
        __tests__
        index.jsx
    CompTwo/
        __tests__
        ...
utils/
    __tests__
    http.js
    user.js
    ...

¿Debo colocarlos dentro de la utils carpeta junto con otras funciones útiles que uso para mi proyecto? Entonces, ¿debería escribir pruebas unitarias también para estas funciones?

avatar de usuario de skyboyer
chico del cielo

Existe la posibilidad de exponer ayudantes como funciones globales sin necesidad de importar módulos explícitamente.

  1. Jest permite configurar algunos archivos que se ejecutarán antes de que cada archivo de prueba se ejecute a través de setupFiles opción de configuración
  2. También Jest proporciona global objeto que puedes modificar y todo lo que pongas allí estará disponible en tus pruebas.

Ejemplo

paquete.json:

"jest": {
    "setupFiles": ["helpers.js"]
} 

ayudantes.js:

global.mockFetchJsonResponse = (data) => {
    ok: () => true,
    json: () => data
};

algún componente.prueba.js:

mockFetchJsonResponse(); // look mom, I can call this like say expect()!

con mecanografiado

TypeScript se quejará con cannot find name 'mockFetchJsonResponse'. Puede solucionarlo agregando un archivo de declaración:

ayudantes.d.ts:

declare function mockFetchJsonResponse(data: any): any;

Crear un nuevo tsconfig.test.json archivo y agregar ese archivo a la files sección y extienda su tsconfig principal:

{
    "extends": "./tsconfig.json",
    "files": ["./.jest/helpers.d.ts"]
}

En tus jest.config.js archivo, agregue una nueva configuración global para ts-jest para tener broma use su nuevo archivo tsconfig:

// ...
globals: {
    "ts-jest": {
         tsconfig: "tsconfig.test.json"
    }
}
// ...

Claro que no responde a su pregunta directa “dónde colocar los archivos”, pero de todos modos depende de usted. Solo necesita especificar esos archivos en setupFiles sección. Como no hay import necesario en las pruebas en realidad no importa.

En cuanto a probar los ayudantes de prueba, no estoy seguro. Vea que es parte de la infraestructura de prueba como el propio archivo de especificaciones. Y no escribimos pruebas para pruebas o nunca se detendría. Claro, depende de usted, diga si la lógica detrás es muy, muy compleja y difícil de seguir. Pero si el asistente proporciona una lógica demasiado compleja/complicada, las pruebas en sí serían imposibles de entender, ¿está de acuerdo?

felicitaciones a eso artículo sobre pruebas de componentes con intl. nunca he tratado globals en broma antes.

  • ESLint afirma sobre no-undef cuando uso tales funciones. Así que creo que es mejor usar import,

    – Andrei Semakin

    1 de octubre de 2019 a las 9:54

  • @AndreySemakin, creo que está bien que elijas importar, pero no estoy seguro de decir que es inequívocamente mejor. Creo que lo que sea que reduzca la fricción para escribir buenas pruebas limpias y mejore la ergonomía del desarrollador es, en última instancia, lo que define mejor. Eso siempre depende del proyecto y del equipo. Personalmente, tiendo a mantener mi configuración de linter más relajada para los archivos de prueba que para el código de la aplicación. Tampoco me importa definir globales en un .d.ts archivo tampoco.

    – D. Patricio

    8 de noviembre de 2019 a las 18:55

  • @ D.Patrick tiene mucho sentido. En cuanto a mí, prefiero mantener mi configuración de linter lo más estricta posible, incluso en los archivos de prueba, para asegurarme de no usar mi propio código de manera incorrecta 🙂 Es por eso que prefiero usar la importación en lugar de definir globales usando Jest.

    – Andrei Semakin

    11 de noviembre de 2019 a las 14:31


  • Esto es lo que estaba buscando y un toque muy agradable con el requisito .ts.

    – COZEN

    28 de noviembre de 2020 a las 10:23


  • @Hubro Supongo que esta respuesta obtiene votos principalmente debido a su edición con parte sobre Typescript.

    – skyboyer

    28 de noviembre de 2020 a las 10:33

TL;RD; crear un /__utils__/ y actualizar testPathIgnorePatterns

Respuesta completa:

Aquí hay solo una sugerencia:

testPathIgnorePatterns: ['/__fixtures__/', '/__utils__/'],

yo suelo /__tests__/ para las pruebas y dentro de él a veces necesito agregar una carpeta con datos que serán utilizados por esas pruebas, entonces uso /__fixtures__/ carpeta.

Del mismo modo, cuando tengo una lógica compartida entre pruebas, las coloco en /__utils__/ carpeta (también dentro /__tests__/)

Para obtener más detalles, lea más sobre testPathIgnorePatterns

Avatar de usuario de Lucio
Lucio

Otro enfoque es tener un directorio de prueba y mover ayudantes en él.

src/
  components/
  utils/
  ...
test/
  testHelpers.js

Luego en la prueba:

// src/components/MyComponent.spec.js
import { helperFn } from '../../test/testHelpers';

Beneficios:

  • Sea explícito de dónde viene la función
  • Separe a los ayudantes que necesitan ser evaluados de aquellos que no ¹

Inconvenientes:

  • los test El directorio puede parecer tonto al contener solo un archivo de ayuda
  • AFAIK, este enfoque no se especifica en la documentación oficial

Parece GitLab está implementando este enfoque en su proyecto RoR.

¹ independientemente del enfoque que adopte, no pruebe los asistentes de prueba. Si el ayudante falla, su prueba también debe fallar. De lo contrario, su ayudante no está ayudando en absoluto.

  • El problema es que estas funciones se empaquetarán a diferencia de los archivos en pruebas carpetas

    – klefevre

    22 oct 2020 a las 16:40

¿Ha sido útil esta solución?