Búsqueda de sitios web

javascript - ¿Cómo puedo compartir mocks de Jest entre múltiples pruebas?


Tengo una versión simulada del aws-sdk, que funciona bien en mis pruebas:

jest.mock("aws-sdk", () => {
  return {
    Credentials: jest.fn().mockImplementation(() => ({})),
    Config: jest.fn().mockImplementation(() => ({})),
    config: {
      update: jest.fn(),
    },
    S3: jest.fn().mockImplementation(() => ({
      getSignedUrlPromise: awsGetSignedUrlMock,
    })),
    SQS: jest.fn().mockImplementation(() => ({})),
  };
});

Sin embargo, muchas de mis pruebas usan el SDK de AWS simulado, y me gustaría no repetir el código simulado innecesariamente. Si muevo la función a un archivo separado e la importo, sin embargo, esto fallará:

En mi archivo testSupport.ts:

export const mockAwsSdk = () => {
  return {
    Credentials: jest.fn().mockImplementation(() => ({})),
    Config: jest.fn().mockImplementation(() => ({})),
    config: {
      update: jest.fn(),
    },
    S3: jest.fn().mockImplementation(() => ({
      getSignedUrlPromise: awsGetSignedUrlMock,
    })),
    SQS: jest.fn().mockImplementation(() => ({})),
  };
};

En el archivo de prueba:

jest.mock("aws-sdk", mockAwsSdk);

Esto falla con:

ReferenceError: Cannot access 'testSupport_1' before initialization

He intentado varias soluciones, incluyendo crear una función padre que tome la instancia de jest, pero todavía no he podido hacer que esto funcione.

¿Cómo puedo compartir mocks de Jest entre múltiples pruebas?

Respuesta #1

Jest tiene una propiedad de configuración moduleNameMapper que se puede usar para especificar una cadena o expresión regular para coincidir con tu importación y reemplazarla con un archivo simulado

Alternativamente, puedes agregar mocks sin especificarlo en el moduleNameMapper colocando tu archivo mock en una carpeta llamada __mocks__ que debería estar en el mismo directorio que el archivo que necesitas mockear

En caso de que esté en node_modules, la carpeta __mocks__ debería estar en tu directorio principal.

Respuesta #2

Tuve el mismo problema y resolví mi problema usando setupFiles.

Crea un archivo jest.config.js:

const config = {
  setupFiles: ['./src/setupFiles.js']
}

export default config

Entonces puedes escribir tus mocks compartidos en setupFiles.js

import { Logger } from 'from-some-package'

jest.spyOn(Logger, 'init').mockImplementation(() => jest.fn())
jest.spyOn(Logger, 'info').mockImplementation(() => jest.fn())
jest.spyOn(Logger, 'debug').mockImplementation(() => jest.fn())
jest.spyOn(Logger, 'error').mockImplementation(() => jest.fn())

jest.mock('third-party-package');

global.fetch = jest.fn()

Artículos relacionados