javascript - 如何在 JavaScript 中克隆静态类?

标签 javascript object ecmascript-6

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

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

    }
    static async findOne() {

    }
    async save() {

    }
  }

但需要根据模型单独模拟它们,例如

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

但我真的希望每个模拟类都有自己的东西,而不必求助于原型(prototype)语法或复制代码。

正在测试中的原因...

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

不会工作,因为我必须为每个模型都有一个特定的类,当然静态方法也是共享的。

注意静态方法和实例方法

我该怎么做?

最佳答案

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

我采用了这样的类工厂:

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' })

因为你可以匿名创建一个类而不说明它的名字,我认为这很有趣,但是如果你不能创建一个工厂,有没有更好的方法来用一个实际的克隆来做到这一点?

关于javascript - 如何在 JavaScript 中克隆静态类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56814944/

相关文章:

javascript - 为什么我的 JS 循环会覆盖对象中以前的条目?

javascript - 返回一个带参数的对象

javascript - 为什么我会得到未定义错误的属性?

javascript - 二维数组中突然出现 "undefined"

javascript - 为什么 HighChart 会挂起浏览器?

javascript - 强制 MP3 文件充当 "Save as..."而不是在浏览器中播放

javascript - jQuery 类型错误 : $ is not a function - But how to continue to use $?

javascript - ES6继承reactjs类时添加默认属性

javascript - 修改对象的 for...of 循环行为

数组中的 Javascript 过滤器对象