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);
});
Проблема в том, что, отвергая обещание, улов никогда не выполняется. Я считаю, что это с неправильным представлением, которое я имею с обещаниями.
Любые идеи, почему улов, а затем не работают здесь?
Вы apiKey
обещание, если apiKey
отсутствует при использовании $q.when()
. Это будет означать успешное завершение обещания. Чтобы указать отказ, вы должны использовать $q.reject
т. $q.reject
if(!apiKey) {
return $q.reject("apiKey not present.");
}
Кроме того, для в then
или catch
обратные вызовы должны быть выполнены в тесте вы обычно должны были бы вызвать цикл дайджеста. Обычный способ сделать это - это получить ссылку на $rootScope
и вызвать $rootScope.$digest()
.
Вы издеваетесь над методом serviceApiEmail.send? Вы вообще достигаете этого? Я бы проверить на что-то еще, а затем отклонитьEmail логический, потому что с Javascript ваш тест будет ложным, даже если "то" часть не достигнута, так что вы, возможно, даже не достигнете частичного решения обещания