【问题标题】:Why does this sequelize-test-helper call not work when a real sequelize connection is in the require tree?当真正的 sequelize 连接在 require 树中时,为什么这个 sequelize-test-helper 调用不起作用?
【发布时间】:2020-09-27 21:26:09
【问题描述】:

我正在使用sequelize-test-helpers,它提供了一个由sinon 间谍和存根组成的模拟续集连接。我有三个文件如下:

//unittest.js
const {sequelize, datatypes} = require('sequelize-test-helpers');
describe('User model test', function(){
    const User = require('../models').User(sequelize, dataTypes);
    console.log(User.hasMany.toString()); //logs sinon spy
    const models = {User, Foo: 'foo'} //shouldn't matter that foo isn't an actual model since 
    before(function(){
       console.log(User.hasMany.toString()); //logs sinon spy
       User.associate(models) //error occurs here
    });
});
//models.js
function User(sequelize, dataTypes){
   User = sequelize.define('user', { 
      name: {
         type: type.STRING
      }
   }
   User.associate = function(models){
      console.log(User.hasMany.toString()); //logs the sequelize.js version of the function
      User.hasMany(models.Foo); //user.hasMany called with something that's not a subclass of Sequelize.Model
   }
return User;
}
module.exports = {User}

我只在运行集成测试(需要实际的 sequelize.js 连接)时遇到代码中提到的错误。如果我单独运行单元测试,我不会遇到任何错误,但同时运行两个测试会导致错误。

【问题讨论】:

    标签: node.js unit-testing sequelize.js chai sinon


    【解决方案1】:

    models.js中的函数User中的User声明应该是const User = //definition。否则,它会产生一个范围问题,导致函数本身在最后返回。这使 User 模型成为单例。 当来自另一个文件(集成测试)的 require 修改了它认为自己的用户模型版本时,它实际上也修改了 unittest.js 文件所包含的用户模型。这对我来说是一个很好的教训,在重用变量名时要格外小心,或者完全避免使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多