Sequelize.js 不应为';不存在

Sequelize.js 不应为';不存在,sequelize.js,Sequelize.js,我正在为使用Sequelize的节点服务器编写单元测试。在插入一些虚假数据后,我收到了错误信息 SequelizeValidationError: notNull Violation: QuestionId cannot be null 注意大小写:问题ID上的大写字母Q 单元测试: description('answerQuestion',()=>{ 它('应该插入答案并获得下一个问题',(完成)=>{ create({lookType:0},{logging:false})。然后(()=>

我正在为使用Sequelize的节点服务器编写单元测试。在插入一些虚假数据后,我收到了错误信息

SequelizeValidationError: notNull Violation: QuestionId cannot be null
注意大小写:
问题ID上的大写字母Q

单元测试:

description('answerQuestion',()=>{
它('应该插入答案并获得下一个问题',(完成)=>{
create({lookType:0},{logging:false})。然后(()=>{
create({type:0,text:'Test Question'},{logging:false})。然后(q1=>{
create({type:1,text:'Next Question'},{logging:false})。然后(q2=>{
console.log('before');
创建({text:'Test option',questionId:1,nextQuestionId:2},{logging:false})。然后(()=>{
console.log('after');
调查。回答问题(1,1,1)。然后(问题=>{
问题.should.have.property('id');
},完成);
},完成);
},完成);
},完成);
},完成);
});
});
控制台输出“before”,但在到达“after”之前出错

问题.js

“严格使用”;
module.exports=函数(sequelize,数据类型){
var Question=sequelize.define('Question'{
身份证:{
allowNull:错,
自动递增:真,
primaryKey:没错,
类型:DataTypes.INTEGER
},
类型:{
allowNull:错,
类型:DataTypes.INTEGER
},
正文:{
allowNull:错,
类型:DataTypes.STRING
},
下一个问题:{
类型:DataTypes.INTEGER
}
}, {
分类方法:{
助理:职能(模型){
models.Question.belongsTo(models.Question,{as:'nextQuestion',foreignKey:{field:'nextQuestionId',allowNull:true}});
models.Question.hasMany(models.Answer,{as:'answers',foreignKey:{field:'questionId',allowNull:false}});
models.Question.hasMany(models.QuestionOption,{as:'options',foreignKey:{field:'questionId',allowNull:false}});
models.Question.hasMany(models.QuestionOption,{as:'referers',foreignKey:{field:'nextQuestionId',allowNull:true}});
}
}
});
返回问题;
};
questionoption.js

“严格使用”;
module.exports=函数(sequelize,数据类型){
var QuestionOption=sequelize.define('QuestionOption'{
身份证:{
allowNull:错,
自动递增:真,
primaryKey:没错,
类型:DataTypes.INTEGER
},
问题编号:{
allowNull:错,
类型:DataTypes.INTEGER
},
正文:{
allowNull:错,
类型:DataTypes.STRING
},
下一个问题:{
类型:DataTypes.INTEGER
}
}, {
分类方法:{
助理:职能(模型){
models.QuestionOption.belongsTo(models.Question,{as:'Question',foreignKey:{field:'questionId',allowNull:false}});
models.QuestionOption.belongsTo(models.Question,{as:'nextQuestion',foreignKey:{field:'nextQuestionId',allowNull:true}});
}
}
});
返回选项;
};
这些模型紧密耦合在一起,具有自引用连接和各种其他混乱。我觉得所有其他型号与此无关,但如果需要,可以提供

直接在SQLite数据库上以与上面的create语句相同的顺序和属性执行SQL不会引发异常,通过大量测试,Sequelize显然不会尝试为
QuestionOption
运行create语句。它在生成要运行的SQL之前出错

一些奇怪的行为是,这些关联在模型中被精心定义,并且所有关联在定义中都有一个小写的
q
,用于
questionId
。所有关联都定义了反向关联,因此Sequelize不应该尝试为属性创建名称

在每次测试之前(成功)删除并重新创建所有表

如果我从create语句for QuestionOption中删除
questionId:1
,那么错误就会变成

SequelizeValidationError: notNull Violation: questionId cannot be null, 
notNull Violation: QuestionId cannot be null
注意两个外壳,一个较低(我拆下的那个),一个较高

下一个可疑对象是
nextQuestionId
关联,但它已在模型中定义,关联的每一方都被定义为
allowNull:true
,我已在create语句中提供了它

我完全对这种行为感到困惑,并质疑这是否是sequelize中的一个bug,尽管我需要在错误地报告它之前确认这一点

其他可能有用的信息包括:

  • 使用命令
    NODE\u ENV=test mocha运行测试
  • 使用
    sync
    (下面的代码)自动创建测试数据库
  • 所有其他测试都通过,但这是测试中唯一使用QuestionOption的测试
  • 我尝试测试的方法在“生产环境”中工作(在连接了客户端的dev中本地运行)
  • 数据库模式已通过SQLite GUI验证,所有列都是适当的(任何带有大写字母Q的表中都没有
    QuestionId
    字段)
为测试创建数据库

beforeach((完成)=>{
sync({force:true,logging:false})。然后(()=>{
sync({force:true,logging:false})。然后(()=>{
sync({force:true,logging:false})。然后(()=>{
sync({force:true,logging:false})。然后(()=>{
完成();
},完成);
},完成);
},完成);
},完成);
});

因此,在四处寻找答案并创建一个测试程序之后。事实证明,这是一个已知的问题