首页 > 解决方案 > 如何实例化要在单元测试中使用的 Sequelize 模型?

问题描述

我正在尝试为 Sequelize 模型编写单元测试。我在调用 Sequelize 方法的类上有一个实例update方法。变成update一个模拟函数是没有问题的。我似乎无法弄清楚如何在X = new MyModel()没有某种错误的情况下正确执行 a 。它告诉我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
        }
      }
    );
  }
}

因此,使用上面的代码示例,如果我有一个实例,Utut我知道我可以轻松地模拟update. 我只是不知道如何初始化类然后模拟事物。

我要编写的测试的目的只是为了查看使用正确的参数调用更新,基于我自己的与 Sequelize 无关的代码。我想确保在进行Sequelize 时我的输入转换设置正确。我不打算检查数据库是否实际更新。我遇到的唯一问题实际上是实例化模型。

所以我需要的只是让这样的代码工作:

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

我不确定为什么它说我需要调用 with new,而这正是我正在做的事情。

标签: javascriptsequelize.jsjestjs

解决方案


因此,利用ModelSequelize.define导致此问题返回的优势。我没有这样做,而是这样做class Utut extends BaseUtut {

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

这样做可以让我new在模型上做,在我的测试中没有问题

更新

刚刚在 2019 年 9 月 23 日看到这个问题没有得到答复。上面的答案看起来是针对旧版本的。我现在只是做

class MyClass extends Sequelize.Model {}
MyClass.init(definition, options);
export default MyClass;

推荐阅读