使用ts-mockito模拟execute函数时提示‘execute不是函数’问题求助
问题
使用ts-mockito和Jest测试TypeScript项目时,模拟抽象类MyAbstractClass的execute函数时出现错误:
Error: 'MyAbstractClass.execute' is not a function
相关代码:
// main.ts abstract class MyAbstractClass { abstract execute(arg): Promise<any>; } class MyImplementedClass extends MyAbstractClass { execute(arg): Promise<any> { // ... do some stuff return foo; } } // main.test.ts describe('测试用例', () => { let mockMyAbstractClass: MyAbstractClass; let myAbstractClassInstance: MyAbstractClass; beforeEach(() => { mockMyAbstractClass = mock(MyAbstractClass); myAbstractClassInstance = instance(mockMyAbstractClass); }); it('works', async () => { // ... when(mockMyAbstractClass.execute(input)).thenResolve(output); // 报错行 }); });
尝试过在原型上设置模拟以及使用jest.fn(),但都没有效果。
解决方案
- ts-mockito无法直接模拟抽象类的抽象方法,因为抽象方法在类的原型上没有具体实现。你需要模拟实现类
MyImplementedClass而非抽象类:
// 修改后的main.test.ts describe('测试用例', () => { let mockMyClass: MyImplementedClass; let myClassInstance: MyImplementedClass; beforeEach(() => { mockMyClass = mock(MyImplementedClass); myClassInstance = instance(mockMyClass); }); it('works', async () => { when(mockMyClass.execute(input)).thenResolve(output); // 后续测试逻辑 }); });
- 如果必须依赖抽象类的类型进行测试,可以创建一个空的实现类用于模拟:
// 在测试文件中新增 class MockableAbstractClass extends MyAbstractClass { execute(arg): Promise<any> { return Promise.resolve(); // 空实现,仅用于模拟 } } // 然后测试时使用这个类 beforeEach(() => { mockMyAbstractClass = mock(MockableAbstractClass); myAbstractClassInstance = instance(mockMyAbstractClass); });
- 另一种方式是直接使用Jest的模拟能力结合类型断言,绕开ts-mockito的限制:
beforeEach(() => { myAbstractClassInstance = { execute: jest.fn().mockResolvedValue(output) } as unknown as MyAbstractClass; }); // 测试时直接调用实例方法即可验证 it('works', async () => { await myAbstractClassInstance.execute(input); expect(myAbstractClassInstance.execute).toHaveBeenCalledWith(input); });
内容的提问来源于stack exchange,提问作者n8m8
相关产品推荐
相关产品推荐

