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!
})

Relaterte artikler