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