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 mockModulePartially
znajdują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().testPath
naprawieniu ścieżki do modułu ( modulePath
), który jest mockowany (uczynienie go względnym do helpers.ts
zawierającego mockModulePartially
). mocksCreator
funkcja przekazana jako drugi argument mockModulePartially
powinna zwrócić makiety modułu. Ta funkcja originalModule
może opcjonalnie na niej polegać.
otherFn
do oddzielnego modułu i udawać.