Sequelize创建功能无法按预期工作

时间:2017-11-15 23:13:16

标签: sequelize.js

我根据此规范在模型上创建了一个实例函数:

describe('Instance methods', function() {
    var task;

    beforeEach(function() {
      return Task.create({
        name: 'task',
      }).then(function(_task) {
        task = _task;
      });
    });

    describe('addChild', function() {
      it('should return a promise for the new child', function() {
        return task.addChild({ name: 'task2' }).then(function(child) {
          expect(child.name).to.equal('task2');
          expect(child.parentId).to.equal(task.id);
        });
      });
    });
..... more not applicable
  });

就是这样,但我没有回来......

Task.prototype.addChild = function(task) {
  return Task.create(task.name).then(function(task) {
    console.log('task', task);
    return task;
  });
};

如规范中所述:

  

应该返回对新孩子的承诺

根据控制台:

  

任务实例方法addChild应该返回新的承诺   子:

这是我要回来的错误:

SequelizeValidationError: Validation Error

那么我没有在数据库中添加此任务我做错了什么? 我没有正确使用create方法吗?

提前致谢!

更新

我试过了:

Task.prototype.addChild = function(task) {   var task = Task.build({
name: task['name'] });   return task.save(); };

但我回来了,

AssertionError: expected null to equal 1

2 个答案:

答案 0 :(得分:1)

我认为在您的实施中存在一些错误:

根据您的测试,使用名称和parentId描述任务。 但是当你创建任务时,你会通过addChild传递{name:'toto'} 并且您直接传递Task.create task.name无法正常工作,该方法尝试接收对象。

所以反而是那个

Task.prototype.addChild = function(task) {
    return Task.create(task.name).then(function(task) {
        console.log('task', task);
        return task;
    });
};

试试这个:

Task.prototype.addChild = function(task) {
    return Task.create(task).then(function(task) {
        console.log('task', task);
        return task;
    });
};

// Than you call like this
await Task.addChild({
    name: 'name',
    parentId: 1
});

// OR

Task.addChild({
    name: 'name',
    parentId: 1
}).then(() => // something);

答案 1 :(得分:0)

create方法接受一个可选参数,这是create方法的结果对象。除了将新任务实例的名称分配给task.name之外,您还必须传递parentId,它是新任务实例的外键。使用“ 1”将帮助您通过此规范,但是您将需要使用this.id(这是调用addChild方法的初始实例)。

Task.prototype.addChild = function(task) {
  return Task.create({
    name: task.name,
    parentId: this.id
  });
}