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

如何在JavaScript中克隆静态类?实现独立的含静态与实例方法的Mock类

解决方案:用工厂函数生成独立的Mock类

要解决这个问题,关键是让每个模型对应的Mock类成为完全独立的个体,而不是共享同一个类的引用。最简洁的实现方式是写一个工厂函数,每次调用它都会生成一个全新的ModelMock类——这样每个类的静态方法、原型链都是独立的,完美适配sinon的mock需求。

实现代码

// 工厂函数:每次调用都返回一个全新的Mock类
function createModelMock() {
  return class ModelMock {
    static async findOneAndUpdate() {}
    static async findOne() {}
    async save() {}
  };
}

如何使用

现在你可以轻松为每个模型生成独立的Mock类,完全不用重复代码:

const models = {
  User: createModelMock(),
  Business: createModelMock()
};

测试场景验证

现在用sinon针对某个模型的实例方法做mock,完全不会影响其他模型:

const sinon = require('sinon');

// 针对User模型的save方法设置专属mock
sinon.mock(models.User.prototype)
  .expects('save')
  .resolves({ specific: 'user-thing' });

// 针对Business模型的save方法设置另一个独立mock
sinon.mock(models.Business.prototype)
  .expects('save')
  .resolves({ specific: 'business-thing' });

为什么这个方案有效

  • 每次调用createModelMock()都会创建一个全新的类,每个类的static方法都是该类独有的,不会和其他模型的Mock共享。
  • 每个类的原型(prototype)也是独立的,所以sinon针对某个原型的mock只会作用于对应模型的实例,不会干扰其他模型。
  • 既复用了Mock类的逻辑,又保证了每个模型Mock的独立性,完美解决你遇到的测试问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:30:37