Brian Adams의 답변을 바탕으로 TypeScript에서 동일한 접근 방식을 사용할 수있었습니다. 또한 jest.doMock ()을 사용 하면 테스트 파일의 일부 특정 테스트에서만 모듈 함수를 모의 처리하고 각각에 대한 개별 모의 구현을 제공 할 수 있습니다.
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) };
});
}
모듈의 모의 기능은 mockModulePartially
별도의 파일에있는 도우미 기능으로 이동되어 다른 테스트 파일 (일반적으로 다른 디렉터리에 위치 할 수 있음)에서 사용할 수 있습니다. 모의되는 expect.getState().testPath
모듈 ( modulePath
)에 대한 경로를 수정 하는 데 의존 합니다 ( helpers.ts
포함에 상대적으로 지정 mockModulePartially
). mocksCreator
두 번째 인수로 전달 된 함수 mockModulePartially
는 모듈의 모의를 반환해야합니다. 이 함수는 수신 originalModule
하고 모의 구현은 선택적으로 의존 할 수 있습니다.
otherFn
별도의 모듈로 추출 하여 조롱해야합니다.