Sinon sequelize stub - Promise.resolve()不返回修改后的对象

时间:2016-11-26 17:39:07

标签: javascript promise sinon

我正在嘲笑Sequelize查找调用,然后在Promise.resolve()中返回对象之前修改结果;

这是我的简化代码;

test.js

test('can pass test', t => {

    let mock_instance = models.myModel.build({
        a_property: 5
    });

    let Stub = sandbox.stub(models.myModel, 'find', () => {
        return Promise.resolve(mock_instance);
    });


    models.myModel.functionCall(mock_instance.id).then(returned_object => {

        let expected = {
            a_property: 6
        };

        t.equal(returned_object.get({plain:true}), expected);

        // Expected { a_property: 6 }
        // Actual { a_property: 5 }
        Stub.restore();

        t.end();
    });
})

model.js //类方法

classFunction: (id) => {
          return new Promise((resolve, reject) => {
            return sequelize.models.myModel.find({
              where: {
                id: id
              }
            }).then(mymodel => {

              mymodel.a_property++;

              resolve(mymodel);
            }).catch(err => {
              reject(err);
            });
          });

为什么会这样?我认为它与Sinon有什么关系,因为它认为它是find()调用的结果,但是我不确定并且我不知道如何修复它

这是反模式吗?还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

据我了解,mymodel.a_property++不会更改基础dataValues对象中的值(您需要调用set来执行此操作)。当您稍后调用returned_object.get({plain:true})时,它会从基础值重建对象。

此外,您的“classFunction”可以更简单。它不需要将其结果包装在额外的Promise中:

classFunction: (id) => {
    return sequelize.models.myModel.find({
        where: { id: id }
    }).then(mymodel => {
        mymodel.set('a_property', mymodel.a_property + 1);
        return mymodel;
    });
};