当 require 树中有真正的 sequelize 连接时,为什么这个 sequelize-test-helper 调用不起作用?
Why does this sequelize-test-helper call not work when a real sequelize connection is in the require tree?
我正在使用 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}
我仅在 运行ning 集成测试(需要实际的 sequelize.js 连接)时遇到代码中提到的错误。如果我 运行 孤立地进行单元测试,我不会遇到任何错误,但是 运行 同时进行这两个测试会导致错误。
models.js
中函数User
内的User声明应该是const User = //definition
。否则,它会产生范围问题,导致函数本身在最后返回。这使得 User 模型成为单例。
当来自另一个文件(集成测试)的 require 修改它认为是它自己的用户模型版本时,它实际上也修改了 unittest.js 文件包含的用户模型。这对我自己来说是一个很好的教训,在重用变量名时要格外小心,或者完全避免使用它们。
我正在使用 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}
我仅在 运行ning 集成测试(需要实际的 sequelize.js 连接)时遇到代码中提到的错误。如果我 运行 孤立地进行单元测试,我不会遇到任何错误,但是 运行 同时进行这两个测试会导致错误。
models.js
中函数User
内的User声明应该是const User = //definition
。否则,它会产生范围问题,导致函数本身在最后返回。这使得 User 模型成为单例。
当来自另一个文件(集成测试)的 require 修改它认为是它自己的用户模型版本时,它实际上也修改了 unittest.js 文件包含的用户模型。这对我自己来说是一个很好的教训,在重用变量名时要格外小心,或者完全避免使用它们。