如何在JavaScript中克隆静态类?

如何在JavaScript中克隆静态类?,javascript,object,ecmascript-6,Javascript,Object,Ecmascript 6,我有一个模型模拟,我想像这样重复使用: // simplified class ModelMock { static async findOneAndUpdate() { } static async findOne() { } async save() { } } const models = { Business: getModelMock(), User: getModelMock() } sinon.mock(mode

我有一个模型模拟,我想像这样重复使用:

// simplified
class ModelMock {
    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' })
但是需要根据模型单独模拟它们,例如

const models = {
  User: ModelMock,
  Business: ModelMock
}
但我真的希望每个模拟类都是自己的,而不必求助于原型语法或复制代码

正在测试的原因

sinon.mock(MockModule.prototype).expects('save').resolves({ specific: 'thing' })
不会工作,因为我必须为每个模型指定一个特定的类,当然静态方法也是共享的

注意静态方法和实例方法

如何做到这一点?

在这种情况下,类工厂似乎起作用 我求助于这样一个一流的工厂:

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

    }
    static async findOne() {

    }
    async save() {

    }
  }
}
您可以这样使用:

// simplified
class ModelMock {
    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' })

因为你可以匿名创建一个类,而不必声明它的名称,我认为这很有趣,但是如果你不能创建工厂,有没有更好的方法可以通过实际的克隆来实现呢?

如果你不想使用工厂函数,你可以使用
new

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

如果您希望每个实例都是自己的,那么为什么不使用“new ModelMock”使save()方法对于每个实例都是唯一的呢?const models={User:new ModelMock,Business:new ModelMock}@nopuck4you该模型需要同时具有静态方法和实例方法,因为它可以由客户机代码更新,同时也可以静态使用。您不应该拥有仅具有静态方法的
类。改为使用对象文字。@Bergi它实际上同时具有这两个类,但我正在模拟外部类,例如mongoose,因此在这种情况下,我无法决定实现细节。ModelMock与静态方法和实例方法一起使用,这是一个警告。我更新了描述以便更清楚。谢谢。@JasonSebring静态方法(通常)可以通过使用
this.constructor.foo