ตามคำตอบของ 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 };
ทดสอบ / 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');
});
});
ทดสอบ / 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) };
});
}
ฟังก์ชัน Mocking ของโมดูลจะถูกย้ายไปยังฟังก์ชันตัวช่วยที่mockModulePartially
อยู่ในไฟล์แยกต่างหากเพื่อให้สามารถใช้งานจากไฟล์ทดสอบต่างๆได้ (ซึ่งโดยทั่วไปแล้วสามารถอยู่ในไดเร็กทอรีอื่น ๆ ได้) มันขึ้นอยู่กับexpect.getState().testPath
การแก้ไขพา ธ ไปยังโมดูล ( modulePath
) ที่ถูกเยาะเย้ย (ทำให้สัมพันธ์กับhelpers.ts
ที่มีmockModulePartially
) mocksCreator
ฟังก์ชั่นส่งผ่านเป็นอาร์กิวเมนต์ที่สองเพื่อmockModulePartially
ควรส่งคืน mocks ของโมดูล ฟังก์ชันนี้ได้รับoriginalModule
และจำลองการใช้งานสามารถเลือกพึ่งพาได้
otherFn
ออกเป็นโมดูลแยกต่างหากและเยาะเย้ยสิ่งนั้น