Как клонировать статический класс в JavaScript? - PullRequest
3 голосов
/ 29 июня 2019

У меня есть макет модели, который я хочу использовать повторно, например:

// 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 ]

1 голос
/ 29 июня 2019

Фабрика классов, кажется, работает в этом случае

Я прибегнул к созданию фабрики классов следующим образом:

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

как вы можете анонимно создать класс без указания его названия, которое, на мой взгляд, было интересно, но есть ли лучшие способы сделать это с реальным клоном, если вы не можете создать фабрику?

0 голосов
/ 29 июня 2019

Если вы не хотите использовать заводскую функцию, вы можете использовать new:

const models = {
  User: new ModelMock(),
  Business: new ModelMock()
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...