Estoy tratando de burlarme react-router-dom en uno de mis casos de prueba para que el useHistory funcione en mis pruebas. Decido usar jest.mock para simular todo el módulo y jest.requireActual para preservar las otras propiedades que no quiero simular.
jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), useHistory: () => ({ location: { pathname: '/list', }, }), }));En realidad, esto se deriva de una de las soluciones altamente calificadas para la siguiente pregunta: ¿Cómo simular el gancho useHistory en broma?
Sin embargo, el compilador de TypeScript marca el siguiente error en la siguiente línea ...jest.requireActual('react-router-dom'),
TS2698: los tipos de propagación solo se pueden crear a partir de tipos de objetos.
Curiosamente, solo enfrento este problema después de actualizar jest y ts-jest a las últimas versiones (jest v26). No enfrento ninguno de estos problemas cuando estaba usando jest 24.xx
"@types/jest": "^26.0.4", "jest": "^26.1.0", "ts-jest": "^26.1.1",¿Alguien sabe cómo resolver este problema para las últimas versiones de broma?
jest.requireActual devuelve un tipo unknown que no se puede propagar.
Un tipo correcto es:
import * as ReactRouterDom from 'react-router-dom'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom') as typeof ReactRouterDom, useHistory: ..., })); Una solución rápida es any :
jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom') as any, useHistory: ..., }));Es aceptable porque no afecta la seguridad del tipo en este caso.
Dado que react-router-dom es un módulo ES, una forma más correcta de simularlo es:
jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom') as any, __esModule: true, useHistory: ..., }));