Jest:如何修改已模拟类的单个方法而不重写整个类模拟
Jest 仅修改已模拟类单个方法的更优方案
不需要重新调用mockImplementation重置整个类的模拟,直接针对目标方法修改其模拟实现即可,对应两种常见使用场景有如下更简洁的方案:
方案1:修改已有实例的单个方法
如果你的测试场景中只需要修改当前已生成实例的对应方法,直接从模拟类的实例池中获取实例后,覆盖目标方法的实现即可:
// 直接从模拟实例池获取已生成的实例,不需要额外手动实例化 const targetInstance = PreviouslyMockedClass.mock.instances[0]; targetInstance.myUpdatedMethod.mockImplementation(() => { console.log("This method is updated, the others are present and unaltered"); });
方案2:修改所有后续新实例的单个方法
如果你需要让后续所有新生成的类实例都使用更新后的方法实现,直接修改模拟类原型上的对应方法即可,不会影响其他方法的原有模拟逻辑:
PreviouslyMockedClass.prototype.myUpdatedMethod.mockImplementation(() => { console.log("This method is updated for all new instances, others are unaltered"); });
以上两种方案相比原有实现的优势:
- 不需要提前实例化一次模拟类,避免构造函数有副作用的场景下出现预期外的执行
- 代码更简洁,没有额外的对象展开逻辑,可读性更高
- 不会意外覆盖类的其他模拟逻辑,风险更低
内容的提问来源于stack exchange,提问作者Caleb Waldner
相关产品推荐
相关产品推荐

