gpt4 book ai didi

javascript - 我如何覆盖 sequelize defaultValue 函数以进行测试?

转载 作者:行者123 更新时间:2023-11-29 13:23:28 25 4
gpt4 key购买 nike

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

我创建了一个 minimal sample project这说明了我用失败的测试描述的问题。

这是相关的代码片段:

    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';

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

最佳答案

答案会漏掉“为什么”部分,但我是这样实现的:

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 而是一个字符串值,那么事情会更容易 - 我们可以只添加一个钩子(Hook):

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

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

关于javascript - 我如何覆盖 sequelize defaultValue 函数以进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37801262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com