Решите Вложенное Обещание в Жасминовом Тесте
У меня есть проблема, связанная с тестированием с вложенными обещаниями.
У меня есть этот метод М, как показано ниже в "Сервис"
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().