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

