2016-06-14 7 views
1

私はsequelizeプロジェクトにunit/integrationテストを追加しようとしていますが、postgresの方言からsqliteに移行する際に問題が発生しています。私は 'id'の 'defaultValue'関数をオーバーライドしようとしています。これにより、CREATE TABLEの構文は正しくなりますが、元のdefaultValueは、.create()によって生成されたINSERT文で使用されます。テスト目的で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

ありがとう、これはトリックでした。受け入れられupvoted。 –

関連する問題