reactjs - Att mocka react-router-dom för useHistory-hooken orsakar följande fel - TS2698: Spridningstyper kan endast skapas från objekttyper
Jag försöker mocka react-router-dom i ett av mina testfall så att useHistory-hooken fungerar i mina tester. Jag bestämmer mig för att använda jest.mock för att mocka hela modulen, och jest.requireActual för att bevara de andra egenskaperna som jag kanske inte vill mocka.
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'),
useHistory: () => ({
location: {
pathname: '/list',
},
}),
}));
Detta är faktiskt hämtat från en av de högt rankade lösningarna på följande fråga: Hur man mockar useHistory-hooken i jest?
Men TypeScript-kompilatorn markerar följande fel på följande rad ...jest.requireActual('react-router-dom'),
TS2698: Spridningstyper kan endast skapas från objekttyper.
Intressant nog stöter jag bara på detta problem efter att ha uppdaterat jest och ts-jest till de senaste versionerna (jest v26). Jag stöter inte på några av dessa problem när jag använde jest 24.x.x.
"@types/jest": "^26.0.4",
"jest": "^26.1.0",
"ts-jest": "^26.1.1",
Vet någon hur man löser detta problem för de senaste versionerna av Jest?
Svar #1
jest.requireActual returnerar unknown-typ som inte kan spridas.
En korrekt typ är:
import * as ReactRouterDom from 'react-router-dom';
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom') as typeof ReactRouterDom,
useHistory: ...,
}));
En snabb lösning är any:
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom') as any,
useHistory: ...,
}));
Det är acceptabelt eftersom det inte påverkar typesäkerheten i detta fall.
Eftersom react-router-dom är ett ES-modul, är ett mer korrekt sätt att mocka det:
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom') as any,
__esModule: true,
useHistory: ...,
}));
