AngularJS + Жасмин + ручка обещаний

0

Im с использованием угловых 1,4 и жасмина 2.4.

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

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

Вот часть функции от emailSvc в вопросе:

// Function found in the emailSvc
    this.sendEmail = function sendEmail(apiKey, token, email_type)
    {

      // Prerequisite to send email
      if(!apiKey) {
        return $q.when("apiKey not present.");
      }

      var deferred = $q.defer();

      // Ajax call
      serviceApiEmail.send(apiKey, token, email_type)
          .then(function(data){
              deferred.resolve(data);
          })
          .catch(function(e){
              deferred.reject(e);
          })

      return deferred.promise;
    }

И мой тестовый пример выглядит следующим образом:

        it('should reject sending email if apiKey is not present', function(){

          var rejectEmail;

          var apiKey,
              verifyToken = acceptedVerifyToken,
              emailType = const_EMAIL_TYPE.SIGNUP;

          i_emailSvc.sendEmail(apiKey, verifyToken, emailType)
            .then(function(){

              // It should not come here
              rejectEmail = false;

            }).catch(function(){

              rejectEmail = true;

            });

            // It comes here without executing any success or fail promise handlers                
             expect(rejectEmail).toBe(true);
        });

Проблема в том, что, отвергая обещание, улов никогда не выполняется. Я считаю, что это с неправильным представлением, которое я имею с обещаниями.

Любые идеи, почему улов, а затем не работают здесь?

Теги:
jasmine
q

2 ответа

2
Лучший ответ

Вы apiKey обещание, если apiKey отсутствует при использовании $q.when(). Это будет означать успешное завершение обещания. Чтобы указать отказ, вы должны использовать $q.reject т. $q.reject

if(!apiKey) {
    return $q.reject("apiKey not present.");
}

Кроме того, для в then или catch обратные вызовы должны быть выполнены в тесте вы обычно должны были бы вызвать цикл дайджеста. Обычный способ сделать это - это получить ссылку на $rootScope и вызвать $rootScope.$digest().

  • 0
    Ты был прав. Мне не хватало для запуска цикла $ digest. Это произошло потому, что я без проблем использовал $ httpBackend и функцию сброса. Теперь я понимаю, что функция flush, вероятно, фактически запускает цикл $ digest, чтобы разрешить обещания с тем, что мы добавили в ответ (200, «ок»). Спасибо чувак! Теперь все имеет смысл.
  • 0
    Да, именно поэтому я спросил, были ли вы уверены, что достигли этого. И $ q.reject () не нужен, это то, что deferred уже делает ..
Показать ещё 1 комментарий
0

Вы издеваетесь над методом serviceApiEmail.send? Вы вообще достигаете этого? Я бы проверить на что-то еще, а затем отклонитьEmail логический, потому что с Javascript ваш тест будет ложным, даже если "то" часть не достигнута, так что вы, возможно, даже не достигнете частичного решения обещания

  • 0
    это было из-за отсутствия цикла дайджеста. Kiitos

Ещё вопросы

Сообщество Overcoder
Наверх
Меню