Как я могу создать модель Sequelize для использования в модульных тестах? - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь написать модульные тесты для модели Sequelize. У меня есть экземпляр метода в классе, который вызывает метод Sequelize update. Превратить update в поддельную функцию - не проблема. Я просто не могу понять, как правильно сделать X = new MyModel() без какой-либо ошибки. Это говорит мне Class constructor model cannot be invoked without 'new'.

Я посмотрел на https://sequelize -mock.readthedocs.io / en / stable / , но то, как оно написано, заставляет меня думать, что оно лучше подходит для моделирования моделей при тестировании классов, использующих преимущества модели, а не самой модели.

const BaseUtut = sequelizeInstance.define('utut', {
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  metadata: {
    type: Sequelize.JSON
  }
});

class Utut extends BaseUtut {
  async updateFromFlat(id, metadata) {

    // in reality, i modify metadata, and want to test things around that
    modifiedMetadata = methodThatModified(metadata);

    // I want to see that update is called with the right output of the modified metadata
    return await this.update(
      {
        id: id,
        metadata: modifiedMetadata
      },
      {
        where: {
          locale: metadata.locale
        }
      }
    );
  }
}

Так что с приведенным выше примером кода, если у меня есть insance Utut, я знаю, что могу легко смоделировать update. Я просто не знаю, как инициализировать класс, чтобы потом высмеивать.

Цель теста, который я хочу написать, состоит в том, чтобы просто увидеть, что update вызывается с правильными параметрами , основываясь на моем собственном коде, который не имеет ничего общего с Sequelize. Я хочу убедиться, что мое преобразование на входах установлено правильно, когда собирается Sequelize. Я не планирую проверять, что БД действительно обновлена. Единственная проблема, с которой я сталкиваюсь - это создание экземпляра модели.

Так что все, что мне нужно, чтобы этот код работал:

const instance = new Utut(); // This line doesn't work
instance.update = Jest.fn();

Я не уверен, почему он говорит, что мне нужно вызывать с new, когда это именно то, что я делаю.

1 Ответ

0 голосов
/ 07 мая 2018

Таким образом, использование преимущества Model, возвращаемого из Sequelize.define, вызывает эту проблему. Вместо того, чтобы делать class Utut extends BaseUtut {, я сделал это:

// Static methods
Object.assign(BaseUtut, {});
// Instance methods
Object.assign(BaseUtut.prototype, {});

Это позволяет мне делать new на модели без проблем в моих тестах

...