2016-11-26 11 views
0

Я издеваюсь над поиском поиска Sequelize и затем изменяю результат перед возвратом объекта в Promise.resolve();Sinon sequelize stub - Измененный объект не возвращается с 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); 
      }); 
      }); 

Почему это происходит? Я предполагаю, что это как-то связано с тем, что Синон перехватывает решение, думая, что это результат вызова find(), но я не уверен, и я не знаю, как его исправить.

Это анти-шаблон? Есть ли способ лучше?

ответ

0

Как я понимаю, mymodel.a_property++ не изменит значение в базовом объекте dataValues (для этого вам необходимо позвонить set). Когда вы вызываете returned_object.get({plain:true}) позже, он восстанавливает объект из базовых значений.

Кроме того, ваша «функция класса» может быть намного проще. Не нужно обертывать его результат дополнительным обещанием:

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

 Смежные вопросы

  • Нет связанных вопросов^_^