2016-06-14 11 views
1

Я пытаюсь добавить тестирование unit/integration в мой проект sequelize, и у меня возникает проблема при переходе с диалекта postgres на sqlite. Я пытаюсь переопределить функцию defaultValue на 'id'. В результате синтаксис для CREATE TABLE правильный, но исходное значение по умолчанию используется в операторе INSERT, сгенерированном .create().Как переопределить функцию sequelize defaultValue для целей тестирования?

Я создал 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'; 

Что лучший способ придать или издеваться функцию DefaultValue?

ответ

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 не будет literal или fn и, скажем, значение строки вместо этого, все было бы намного проще - мы могли бы только добавил крюк:

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

Предлагаю вам найти ответы на вопрос «почему» на странице sequelize issue tracker.

+0

спасибо, это сделал трюк. принимается и поддерживается. –

Смежные вопросы