如何在JavaScript中克隆静态类?

时间:2019-06-29 03:50:39

标签: javascript object ecmascript-6

我有一个想要像这样重用的模型模拟:

// simplified
class ModelMock {
    static async findOneAndUpdate() {

    }
    static async findOne() {

    }
    async save() {

    }
  }

,但需要根据模型分别模拟它们,例如

const models = {
  User: ModelMock,
  Business: ModelMock
}

但是我真的希望每个模拟类都是自己的东西,而不必诉诸原型语法或重复代码。

原因在于测试...

sinon.mock(MockModule.prototype).expects('save').resolves({ specific: 'thing' })

不起作用,因为我必须为每个模型都拥有一个特定的类,并且当然也共享静态方法。

同时注意静态方法和实例方法

我该怎么做?

2 个答案:

答案 0 :(得分:1)

在这种情况下,类工厂似乎可以工作

我求助于像这样的班级工厂:

function getModelMock() {
  return class {
    static async findOneAndUpdate() {

    }
    static async findOne() {

    }
    async save() {

    }
  }
}

您可以这样使用:

const models = {
  Business: getModelMock(),
  User: getModelMock()
}

sinon.mock(models.Business.prototype).expects('save').resolves({ _id: 'businessId' })
sinon.mock(models.Business).expects('findOne').resolves({ _id: 'businessId' })
sinon.mock(models.User.prototype).expects('save').resolves({ _id: 'userId' })

因为您可以匿名创建一个类而不必说出我认为很有趣的名称,但是如果您不能建立工厂,是否有更好的方法可以通过实际的克隆来实现?

答案 1 :(得分:0)

如果您不想使用工厂功能,则可以使用new

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