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

如何在Jest/TypeScript中重置类?避免重复实例化

在Jest/TypeScript中复用类实例并自动重置

你遇到的mockClear报错,是因为mockClear是JestMock对象的专属方法,而你用的AnimalManager是真实类,不是通过Jest mock出来的,所以直接调用会报错。

你的核心需求是避免在每个测试块重复写new AnimalManager(),同时保证每个测试用的都是干净的实例(状态重置),可以这么做:

方案1:用beforeEach自动初始化干净实例

在describe块里声明变量,然后在beforeEach中创建新实例,这样每个测试执行前都会自动生成全新的实例,状态自然重置,不用重复写new:

describe("default subscription actions", ()=>{
  const tigerObserver= new TigerObserver();
  const fishObserver = new FishObserver();
  // 声明实例变量
  let animalManager: AnimalManager;

  // 每个测试前自动初始化新实例
  beforeEach(() => {
    animalManager = new AnimalManager();
  });

  describe("subscribe", ()=>{
    it(`adds new subscribers`, () => {
      animalManager.subscribe(tigerObserver);
      animalManager.subscribe(fishObserver);
      expect(animalManager.subscribers.length).toEqual(2);
    });
  });

  describe("unsubscribe", ()=>{
    it(`removes subscriber`, () => {
      animalManager.subscribe(tigerObserver);
      animalManager.subscribe(fishObserver);
      // 调用unsubscribe才会让长度变为1
      animalManager.unsubscribe(fishObserver);
      expect(animalManager.subscribers.length).toEqual(1);
    });
  });
});

方案2:给类加重置方法(可选)

如果不想每次都创建新实例,可以给AnimalManager加一个重置状态的方法,然后在beforeEach里调用:

// AnimalManager类中新增重置方法
export default class AnimalManager implements Subject {
  public subscribers: Observer[] = [];

  // 新增重置状态的方法
  public reset(): void {
    this.subscribers = [];
  }

  // 原有其他方法...
}

// 测试代码中复用实例+重置
describe("default subscription actions", ()=>{
  const tigerObserver= new TigerObserver();
  const fishObserver = new FishObserver();
  const animalManager = new AnimalManager();

  beforeEach(() => {
    animalManager.reset();
  });

  // 后续测试块直接复用这个animalManager即可
});

为什么之前的mockClear不行?

只有当你用Jest把AnimalManager mock成模拟类时,才能调用mockClear,比如:

// 先mock整个类
jest.mock('./AnimalManager');

// 此时AnimalManager是Mock类型,才能调用mockClear
beforeEach(() => {
  (AnimalManager as jest.Mock).mockClear();
});

但这种场景是用来模拟类的行为,不是为了获取干净的真实实例,不符合你的需求。

内容的提问来源于stack exchange,提问作者lost9123193

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:35:26