Использование Sinon для заглушки кода внутри Promise и возврата Resolve () - PullRequest
0 голосов
/ 23 января 2019

Я застрял в этом в последний день, и я решил, что мне нужна помощь. У меня есть следующий метод класса javascript, для которого я пишу модульный тест:

getUser = function(req, res){
  return new Promise(function(resolve, reject){
      User.getByUserId(user_id, function(err, user){
        if (err){
          return reject({ message: defaultErrorMessage })
        } else {
          return user ? resolve() : reject({ message: 'The specified user does not exist.' })
        }
      })
  }).then(function(){

        ....Promise Chain Continues...

})

По сути, я пытаюсь написать модульный тест, который блокирует вызов User.getByUserId mongoose со следующим:

let resolvedPromise = sinon.stub().resolves();
sinon.stub(User,'getByUserId').returns(resolvedPromise);

Я думаю, что хочу остановить вызов БД, который находит пользователя, и вернуть решенное обещание, чтобы цепочка обещаний могла продолжаться, однако мое текущее решение не позволяет цепочке обещаний продолжаться.

Как у меня есть заглушка sinon в обещании, и чтобы этот заглушка возвращал решимость (), которая позволяет цепочке обещаний продолжаться? Помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 23 января 2019

User.getByUserId - это функция с обратным вызовом.Мы не могли использовать returns из sinon.stub для этого.Решение заключается в использовании yields

sinon.stub(User, 'getByUserId').yields(null, userObj);

Ссылка:

https://sinonjs.org/releases/v7.2.2/stubs/#stubyieldsarg1-arg2-

Обновление

Разница междуyields и returns можно описать с помощью приведенного ниже примера:

// User.js

/** function with ordinary return **/
function getUser() {
  return { name: 'admin', sex: 'male' };
}

/** function with callback and no return **/
function getUserById(id, callbackFunc) {
  callbackFunc();
}

/** function that return promise **/
function getUserBySex(sex) {
  return getFromDb(); // getFromDb() is a promise function
}

И для заглушки sinon в тестовом файле

// test.js

// use `returns` for function with ordinary return
sinon.stub(User, 'getUser').returns({ name: 'whatever', sex: 'female' });

// use `yields` or `callArgsWith` for function that has callback function
sinon.stub(User, 'getUserById').yields(null, userObj);
sinon.stub(User, 'getByUserId').callsArgWith(1, null, userObj); // 1 => second parameter

// use `resolves` for function that returns promise
sinon.stub(User, 'getUserBySex').resolves(userObj);

Дополнительные ссылки:

...