First the three important lines for anyone who needs to copypaste. I'll explain later!
jest.mock('@/components/LocationService'); const MockedLocationService = <jest.Mock<LocationService>>LocationService; const mockedLocationService = <jest.Mocked<LocationService>> new MockedLocationService();
Now a bit of explanation. When you use jest to mock an import (which I am still not convinced is a good pattern) the mock is still typed as the original import. This means that Typescript will complain if you do something like MockedImport.mocks
.
Below is an example setup where this would be useful
If you need to mock implementation
export class LocationService { async getCurrentLocation(): Promise<CurrentPosition> { // #... } }
export class Map { constructor(locationService: LocationService) { this.locationService = locationService } setPosition(): Position { const position = this.locationService.getCurrentPosition // # ... // # Do something with position } }
jest.mock('@/components/LocationService'); describe('Map.ts', () => { it('uses the current location to set the position', () => { const MockedLocationService = <jest.Mock<LocationService>>LocationService; const mockedLocationService = <jest.Mocked<LocationService>>new MockedLocationService(); mockedLocationService.getCurrentLocation.mockResolvedValue({ lat: 3, long: 3 }); const map = new Map(mockedLocationService) // # Do something with your mocked instance }); });
Top comments (1)
More concise solution: github.com/userlike/joke