我遇到的问题是,当我尝试创建新实例并将其保存到数据库时,我的mocha单元测试总是返回错误。
型号:
//db is a global instance of the sequelize pool connection
var sequelize = require('sequelize');
var users = db.define('users', {
uuid: {
type: sequelize.STRING(36),
allowNull: false,
unique: true,
validate: {
isUUID: 4
}
},
username: {
type: sequelize.STRING(100),
allowNull: false,
unique: 'idxProvUsr'
}
}, {
freezeTableName: true
});
module.exports = users;
控制器:
var usersDB = require('../models/users');
var sequelize = require('sequelize');
var usersCtrl = {
userCreate: function (userData, callback) {
var test = usersDB.build(userData);
test.save()
.then(function (data) {
callback(true, data);
})
.catch(function (error) {
if (error) {
callback(false, error);
}
});
},
};
module.exports = usersCtrl;
测试
'use strict';
var chai = require('chai');
var uuid = require('node-uuid');
var userCtrl = require('../app/controllers/users');
var userData = {
uuid: null,
username: 'manuerumx'
};
describe('Users Controller', function(){
it('Fails add new User', function(done){
userCtrl.userCreate(userData, function(isOk, response){
chai.expect(isOk).to.equal(false);
done();
});
});
it('Add new User', function(done){
userData.uuid = uuid.v4();
userCtrl.userCreate(userData, function(isOk, response){
chai.expect(isOk).to.equal(true);
done();
});
});
});
第一次单元测试没问题。未添加实例,因为需要uuid字段。
第二,是问题所在。实例被添加到数据库中,但catch指令总是返回相同的错误:
{ [AssertionError: expected true to equal false]
message: 'expected true to equal false',
showDiff: true,
actual: true,
expected: false }
已经测试过相同的结果:
usersDB.build(userData).save().then(...).catch(...);
usersDB.create(userData).then(...).catch(...);
我做错了什么?是因为我正在使用带有回调的承诺吗?
不是isUUID验证,我已经尝试删除它。
答案 0 :(得分:1)
我想,问题与异步执行有关。虽然第一次测试尚未完成,但userData.uuid会逐秒获得值。尝试在第二次测试中定义并传递另一个用户数据:
it('Add new User', function(done){
var correctUserData = {
uuid: uuid.v4(),
username: "manuerumx"
};
userCtrl.userCreate(correctUserData, function(isOk, response){
chai.expect(isOk).to.equal(true);
done();
});
});