2016-03-11 3 views
2

При модульном тестировании Loopback необходимо использовать обратные вызовы с помощью методов upsert. Так, например ... вместо того, чтобы писать что-то вдоль линий этого:Промежуточные петлевые модели

before(function() { 

    Student = server.models.Student 
    Course = server.models.Course 


    Course.upsert({id: 1, key: 'A', department: 'Original department'}) 
    Student.upsert({id: 1, points: 5000}) 


}) 

необходимо убедиться, что обратные вызовы используются с upsert. Так как у меня есть много моделей, я инициализация ниже я использую асинхра:

before(function (done) { 

    Student = server.models.Student 
    Course = server.models.Course 


    async.waterfall([ 
      function (callback) { 
       Course.upsert({id: 1, key: 'A', department: 'Original department'}, callback) 
      }, 
      function (f, callback) { 
       Student.upsert({id: 1, points: 5000}, callback) 
      }, 

     ], 
     function (err, results) { 
      done(err) 
     }) 

}) 

Вместо асинхронного, как бы приведенный выше код будет изменен, чтобы использовать посылы?

Моя мысль в том, что с обещаниями, я мог бы написать код, который выглядит следующим образом:

before(function (done) { 

    Student = server.models.Student 
    Course = server.models.Course 


    Course.upsert({id: 1, key: 'A', department: 'Original department'}) 
     .then(Student.upsert({id: 1, points: 5000}) 
     .then(function(err) { done(err) } 


}) 

, но я не увенчались успехом обвязка в обещаниях.

EDIT из ответов ниже ...

before(function (done) { 


    Course = server.models.Course 

    Course.upsertWithPromise = Promise.promisify(Course.upsert) 

    Course.upsertWithPromise({id: 1, key: 'A', department: 'Original department'}) 
     .then(done) 

    } 




it.only('Course upsert', function (done) { 

    Course.findById(1, function (err, course) { 

     expect(course.id).to.equal(1) 
     expect(course.department).to.equal('Original department') 

     done() 


    }) 
}) 

ответ

1

Есть два возможных решения. Во-первых, это ручное обещание. Ваши функции будет выглядеть следующим образом:

server.models.Student.upsert = function(data) { // Note NO CALLBACK 
    return new Promise(function(resolve, reject) { 
    // Here can do all async staff and when done sucessfully call: 
    resolve(result); 
    // OR on error call: 
    reject(err); 
    }); 
} 

Второе решение будет использовать библиотеку для той же цели.

  1. var q = require ('q'); // Использование библиотеки q
  2. НЕ изменяйте ваши модели. Они должны принимать обратный вызов в качестве последнего аргумента (следуйте за соглашением узла)
  3. var server.models.Student.upsertWithPromice = q.denodeify (server.models.Student.upsert);
  4. прибыль.

Тогда ваш код из вашего примера должен работать нормально.

+0

Это потрясающе и чрезвычайно полезно! Вы упоминаете q вместо Bluebird. Является ли q лучше подходящим для такого рода обещаний? – user465342

+0

Оба являются аналогичными библиотеками и имеют почти одинаковые функциональные возможности. Я просто использую Q и имел живой пример. –

+0

Делает смысл. Отредактировав исходный вопрос, я думаю, что это изменения, которые вы предлагаете. Как отмечено в вопросе, не находит id :( – user465342

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