如何在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
相关产品推荐
相关产品推荐

