I\'m creating a custom mock (of an ES6 class) with Jest in a Typescript project. The mock creates end exports a few mock.fn()
so that they could be spied on in
I have the same problem and I only have a workaround. My problem is that I manually mock fs from node.
So I have a manual mock for 'fs' which looks roughly like this:
const fs = jest.genMockFromModule("fs");
let mockFiles = {};
function __clearMocks(){
mockFiles = {};
}
module.exports = fs;
So clearly when my test case imports fs it would not work:
import * as fs from 'fs';
fs.__clearMocks();
To get this working I create an extension of the type:
declare module 'fs' {
export function __clearMocks(): void;
}
So now I can modify my testcase like this:
import * as fs from 'fs';
import 'fsExtension';
fs.__clearMocks();
Hopefully this helps you!
The easiest way to fix this is to use ts-jest's mocked()
helper. The helper will make sure you have access to the mock test methods. __tests__/soundPlayer.ts
would then look as follows:
// __tests__/soundPlayer.ts
import { mocked } from "ts-jest/utils";
import SoundPlayer from '../soundPlayer';
jest.mock('../soundPlayer');
const soundPlayer = mocked(new SoundPlayer());
beforeEach(() => {
soundPlayer.playSoundFile.mockClear();
});
it('is called with filename', () => {
const filename = 'song.mp3';
soundPlayer.playSoundFile(filename);
expect(soundPlayer.playSoundFile).toBeCalledWith(filename);
});
If you really want to include mockPlaySoundFile
you could do it by telling the Typescript compiler to suppresses the import error:
// @ts-ignore
import { mockPlaySoundFile } from '../soundPlayer';
Also, have a look at the example in my repo here: https://github.com/tbinna/ts-jest-mock-examples, in particular, your soundPlayer
example: https://github.com/tbinna/ts-jest-mock-examples/tree/master/sound-player