enhetstesting - Jest mock node-modul fungerer ikke med Typescript
Jeg prøver å mocke modulen uuid/v4 som kommer fra npm. For å gjøre det, har jeg opprettet en mock-mappe som foreslått av jest: https://jestjs.io/docs/en/manual-mocks
Min mappestruktur :
├──__mocks__
| └──uuid
| └──v4.ts
├──src
│ └──__tests__
│ └── ...
├──node_modules
Den mock node-modulfilen v4.ts :
module.exports = jest.fn();
Når jeg prøver å importere uuid/v4 i testfilen min, burde jest normalt importere mocken, og jeg burde kunne leke med den.
Her er min testfil :
import uuidv4 from 'uuid/v4';
it('should create a job', () => {
const jobId = 'fake-job-id';
uuidv4.mockReturnValue(jobId);
...
}
Dessverre ser det ut til at mock-importen ikke fungerer fordi jeg ikke kan legge til mockReturnValue som tilbys av jest, og jeg får følgende TypeScript-feil: property 'mockReturnValue' does not exist on type v4. ts(2339)
Har du noen idé om hvordan jeg kan fikse det, vær så snill? Takk på forhånd.
Svar #1
En vanlig måte å håndtere en situasjon som dette på er å auto-mocke modulen i testen, og deretter fortelle TypeScript at modulen er auto-mocket ved å bruke jest.Mocked slik:
jest.mock('uuid/v4'); // <= auto-mock uuid/v4
import uuidv4 from 'uuid/v4';
const mocked = uuidv4 as jest.Mocked<typeof uuidv4>; // <= tell TypeScript it's an auto-mock
test('hi', () => {
mocked.mockReturnValue('mocked result'); // <= use the properly typed mock
expect(uuidv4()).toBe('mocked result'); // Success!
})
Dessverre ser ikke typingen for uuid/v4 ut til å fungere riktig med denne tilnærmingen.
Som en midlertidig løsning kan du bruke en typepåstand:
jest.mock('uuid/v4'); // <= auto-mock uuid/v4
import uuidv4 from 'uuid/v4';
test('hi', () => {
(uuidv4 as jest.Mock).mockReturnValue('mocked result'); // <= use a type assertion
expect(uuidv4()).toBe('mocked result'); // Success!
})
