【问题标题】:Sinon sequelize stub - Modified object not returned with Promise.resolve()Sinon sequelize stub - Promise.resolve() 未返回修改后的对象
【发布时间】:2016-11-26 17:39:07
【问题描述】:

我正在模拟 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 拦截了 resolve 认为这是 find() 调用的结果有关,但我不确定,也不知道如何解决。

这是一种反模式吗?有没有更好的办法?

【问题讨论】:

    标签: javascript promise sinon


    【解决方案1】:

    据我了解,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;
        });
    };
    

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 2014-08-04
      • 2018-10-02
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2021-09-19
      • 2019-09-26
      相关资源
      最近更新 更多