Sequelize.js在create instance上返回错误

时间:2016-11-02 19:30:43

标签: node.js mocha sequelize.js

我遇到的问题是,当我尝试创建新实例并将其保存到数据库时,我的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验证,我已经尝试删除它。

1 个答案:

答案 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();
        });
    });