Решите Вложенное Обещание в Жасминовом Тесте

У меня есть проблема, связанная с тестированием с вложенными обещаниями.

У меня есть этот метод М, как показано ниже в "Сервис"

M(){
 M1().then (
M2();
return promise1;
)
};

и M2 и M1 имеет похожие определения, такие как

        M2(){
        var deferred = $q.defer();
        // for M1 u may call someUrl1
        $http.get(someUrl2).then(function (success) {
            deferred.resolve(success.data);
        }, function () {
            deferred.reject();
        });
    return deferred.promise;
}

И вот проблема: у меня есть тестовый пример, который делает ниже

spyOn(Service, 'M2').and.callThrough();

httpBackend.expectGET(SomeUrl1).respond(200,Response1, {'Content-type': 'application/json'});
httpBackend.expectGET(SomeUrl2).respond(200,Response2, {'Content-type': 'application/json'});
Service.M().then(function (Response1) {
   expect(Service.M2).toHaveBeenCalled();
// here goes some expect operations on response coming from M()
});
httpBackend.flush();

Так же, как и выше. Если я вызываю M(), то обещание только M1 становится разрешенным, а не M2 (как его вложенность) - любая идея, как также разрешить вложенное обещание.

нельзя использовать $rootscope.$digest() или scope.$apply(), так как это на уровне обслуживания.

На данный момент контрольный пример дает: метод M2 никогда не вызывался и разрешает результат из M2 как объект обещания, но не фактический ответ

К вашему сведению: модульное тестирование только на M2 /M1 работает, поскольку обещание только одно.

Пожалуйста, дайте мне знать, как решить эту проблему.

2 ответа

Я решил проблему, удалив вложение обещаний, как показано ниже.

M(){
var common ;
 M2().then(function (response2){
common  = response2;
});

 M1().then (
// use common here
return promise1;
)
};

и обменялись этими двумя в моем тестовом случае, как М2 решается первым

httpBackend.expectGET(SomeUrl2).respond(200,Response2, {'Content-type': 'application/json'});
httpBackend.expectGET(SomeUrl1).respond(200,Response1, {'Content-type': 'application/json'});
M(){
 M1().then ( function(response1) {
var common;
M2().then( function(response2){
common = response2
// resolve promise1 only if u resolved promise2 
deferred1.resolve( do somthing with common and  response1)
});
});
};

Это трюк, который эффективно разрешает обещание M2 использовать M2().

Другие вопросы по тегам