Opierając się na odpowiedzi Briana Adamsa, w ten sposób mogłem zastosować to samo podejście w TypeScript. Co więcej, za pomocą jest.doMock () można mockować funkcje modułu tylko w niektórych specyficznych testach pliku testowego i dostarczać dla każdego z nich indywidualne mockowe implementacje.
src / module.ts
import * as module from './module';
function foo(): string {
return `foo${module.bar()}`;
}
function bar(): string {
return 'bar';
}
export { foo, bar };
test / module.test.ts
import { mockModulePartially } from './helpers';
import * as module from '../src/module';
const { foo } = module;
describe('test suite', () => {
beforeEach(function() {
jest.resetModules();
});
it('do not mock bar 1', async() => {
expect(foo()).toEqual('foobar');
});
it('mock bar', async() => {
mockModulePartially('../src/module', () => ({
bar: jest.fn().mockImplementation(() => 'BAR')
}));
const module = await import('../src/module');
const { foo } = module;
expect(foo()).toEqual('fooBAR');
});
it('do not mock bar 2', async() => {
expect(foo()).toEqual('foobar');
});
});
test / helpers.ts
export function mockModulePartially(
modulePath: string,
mocksCreator: (originalModule: any) => Record<string, any>
): void {
const testRelativePath = path.relative(path.dirname(expect.getState().testPath), __dirname);
const fixedModulePath = path.relative(testRelativePath, modulePath);
jest.doMock(fixedModulePath, () => {
const originalModule = jest.requireActual(fixedModulePath);
return { ...originalModule, ...mocksCreator(originalModule) };
});
}
Mockowanie funkcji modułu jest przenoszone do funkcji pomocniczej mockModulePartiallyznajdującej się w oddzielnym pliku, dzięki czemu może być używana z różnych plików testowych (które zwykle mogą znajdować się w innych katalogach). Polega na expect.getState().testPathnaprawieniu ścieżki do modułu ( modulePath), który jest mockowany (uczynienie go względnym do helpers.tszawierającego mockModulePartially). mocksCreatorfunkcja przekazana jako drugi argument mockModulePartiallypowinna zwrócić makiety modułu. Ta funkcja originalModulemoże opcjonalnie na niej polegać.
otherFndo oddzielnego modułu i udawać.