我使用express-cassandra来执行CRUD操作。当我运行服务并使用邮递员调用create API时,一切都按预期工作。
然而,当我使用chai测试用例调用相同的控制器函数时,它给出了一个错误“models.instance.table不是构造函数”。
以下是代码段:
dbClient.js :初始化与Cassandra的连接
var models = require('express-cassandra');
var settings = require('../../settings.js');
var config = settings.UserService.database.cql;
//Tell express-cassandra to use the models-directory, and
//use bind() to load the models using cassandra configurations.
models.setDirectory( __dirname).bind(
{
clientOptions: {
contactPoints: [config.host],
protocolOptions: { port: config.port },
keyspace: config.databaseName,
queryOptions: {consistency: models.consistencies.one}
},
ormOptions: {
//If your keyspace doesn't exist it will be created automatically
//using the default replication strategy provided here.
defaultReplicationStrategy : {
class: 'SimpleStrategy',
replication_factor: 1
},
migration: 'safe',
createKeyspace: true
}
},
function(err) {
if(err) console.log(err);
else console.log(models.timeuuid());
}
);
module.exports = models ;
QuestionnaireMasterModel.js :定义模型
"use strict";
module.exports = {
fields: {
id: {
type: "uuid",
default: { "$db_function": "uuid()" }
},
questionnaire_type: "varchar",
question: "varchar",
response_option: {
type: "list",
typeDef: "<varchar>"
},
owner_rolecode: "varchar",
is_active: "boolean",
created: {
type: "timestamp",
default: { "$db_function": "toTimestamp(now())" }
},
updated: {
type: "timestamp",
default: { "$db_function": "toTimestamp(now())" }
}
},
key: ["id"],
table_name: "questionnaire_master"
}
questionnaire_master.js :创建新条目的控制器功能
var questionnaireMasterController = {};
var models = require('../models/dbCLient');
//var questionnaireMasterModel = require('../models/QuestionnaireMasterModel');
var responseEntity = require('../utility/response_entity');
questionnaireMasterController.createQuestionnaire = function (params, callback) {
var uuid = models.uuid();
var question = new models.instance.QuestionnaireMaster({
id : uuid,
questionnaire_type : params.questionnaire_type,
question: params.question,
response_option : params.response_option,
owner_rolecode : params.owner_rolecode,
is_active: true
});
question.save(function (err) {
if (err) {
if(err.name = 'apollo.model.validator.invalidvalue')
responseEntity.sendResponse(422, 'Invalid input paramters', null, {name : err.name, message : err.message},callback);
else
responseEntity.sendResponse(501, 'Error Occured', null, {name : err.name, message : err.message},callback);
console.log("err ::: ",err);
return;
}
responseEntity.sendResponse(201,"Question created successfully", { id: uuid }, null ,callback);
console.log('Yuppiie!');
});
}
// User controller functions and expose it to app
module.exports = questionnaireMasterController;
调用API时会调用
questionnaire_master_test.js :给出错误的测试用例
var chai = require('chai');
var expect = chai.expect;
var chaiHttp = require('chai-http');
var randomstring = require("randomstring");
var questionnaireMasterController = require('../controller/questionnaire_master.js')
chai.use(chaiHttp);
var supertest = require('supertest');
describe('Check for create Patient', function () {
it('Should create a new question in questionnaire master table', function (done) {
var question = {
"questionnaire_type": "Select one",
"question": "This is dummy question",
"response_option": ["dummyoption1", "dummyoption2"],
"owner_rolecode": "01",
"is_active": true
};
questionnaireMasterController.createQuestionnaire(question, function (result) {
JSON.stringify(result);
expect(result.code).to.be.a('number').eq(201);
done();
});
});
});
再次从questionnaire_master_test.js调用createQuestionnaire()。返回以下错误:
TypeError: models.instance.QuestionnaireMaster is not a constructor
at Object.questionnaireMasterController.createQuestionnaire (controller\questionnaire_master.js:9:877)
at Context.<anonymous> (test\questionnaire_master_test.js:20:39)
答案 0 :(得分:1)
这是由于代码的非阻塞性质,它试图在加载模型之前执行保存。
我遇到了类似的问题&amp;仅仅为了测试目的,我在测试脚本中设置超时,然后执行保存和数据插入工作完全正常。
我做了类似的事情:
setTimeout(function(){ client.save(model.instance.person,param); }, 3000);
答案 1 :(得分:0)
未加载模型时通常会抛出该错误。在这种情况下,可能是由于 dbClient.js 文件中提供给 models.setDirectory(__ dirname)调用的目录路径。默认情况下, __ dirname 将指向当前模块目录(在本例中为包含dbClient.js的目录)。
您的应用目录结构在帖子中并不完全清楚,但我怀疑您的模型与dbClient.js模块位于不同的目录中。如果这是真的,您将需要编辑对setDirectory()的调用以反映模型文件夹的正确路径。
例如,如果您的应用结构是......
C:\回购\为approot \ dbClient.js
C:\回购\为approot \模型\ QuestionnaireMasterModel.js
然后更改提供给setDirectory ...
的路径models.setDirectory(__ dirname +'/ models')。bind(...)
答案 2 :(得分:0)
您应按以下说明使用bind的回调函数:Express Cassandra Auto-Load Models from a Directory - models.instance.Person is not a constructor
models.setDirectory( __dirname + '/models').bind(
{
...
},
function(err) { // add your code here }
);