当真正的sequelize连接在需求树中时,为什么此sequelize-test-helper调用不起作用?

问题描述 投票:0回答:1

我正在使用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个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.