You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:22:14