我正在嘲笑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()调用的结果,但是我不确定并且我不知道如何修复它
这是反模式吗?还有更好的方法吗?
答案 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;
});
};