【问题标题】:How do I override a sequelize defaultValue function for testing purposes?如何覆盖 sequelize defaultValue 函数以进行测试?
【发布时间】:2016-10-14 13:14:04
【问题描述】:

我正在尝试将单元/集成测试添加到我的 sequelize 项目中,但在从 postgres 方言迁移到 sqlite 时遇到了问题。我正在尝试覆盖“id”上的“defaultValue”函数。这导致 CREATE TABLE 的语法正确,但在.create() 生成的 INSERT 语句中使用了原始 defaultValue。

我创建了一个minimal sample project,它说明了我所描述的问题与一个失败的测试。

下面是相关代码sn-p:

    User = sequelize.define('User', {
    id: {
      type: Sequelize.UUID,
      field: 'id',
      defaultValue: sequelize.literal("uuid_generate_v1mc()"),
      primaryKey: true
    },
    name: {
      type: Sequelize.STRING,
      field: "first_name"
    },
});

// why doesn't setting these attributes override the default value
// provided by User.create?
User.attributes.id.defaultValue='b9c96442-2c0d-11e6-b67b-9e71128cae77';
User.tableAttributes.id.defaultValue='b9c96442-2c0d-11e6-b67b-9e71128cae77';

注入或模拟 defaultValue 函数的最佳方法是什么?

【问题讨论】:

    标签: javascript postgresql sqlite sequelize.js


    【解决方案1】:

    答案会漏掉“为什么”部分,但这是我的工作方式:

    before(function() {
        // Define a table that uses a custom default value
        User = sequelize.define('User', {
            id: {
              type: Sequelize.UUID,
              field: 'id',
              defaultValue: sequelize.literal("uuid_generate_v1mc()"),
              primaryKey: true
            },
            name: {
              type: Sequelize.STRING,
              field: "first_name"
            },
        });
    
        User.attributes.id.defaultValue.val = '"b9c96442-2c0d-11e6-b67b-9e71128cae77"';
    
        return sequelize.sync();
    });
    

    不过,我怀疑应该有更简单的方法来实现相同的结果。


    有趣的是,如果defaultValue 不是literalfn 而是一个字符串值,事情会容易得多——我们可以添加一个钩子:

    User.beforeCreate(function (user) {
      user.dataValues.id = 'b9c96442-2c0d-11e6-b67b-9e71128cae77';
    });
    

    我建议您在sequelize issue tracker 寻求“为什么”问题的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 2019-05-11
      • 2017-05-03
      • 2021-10-28
      • 2011-08-09
      • 1970-01-01
      相关资源
      最近更新 更多