После моего myService.spec.js:тест AngularJs жасмин блок терпит неудача с непредвиденным запросом
'use strict';
describe('myService', function() {
var dependentService,dependentService1,rootScope,$q;
beforeEach(module('myModule.myConfig'));
beforeEach(module('myModule'));
beforeEach(inject(function (_myService_, _$rootScope_,
_$q_,_dependentService1_,_dependentService_) {
myService= _myService_;
rootScope = _$rootScope_.$new();
$q = _$q_;
dependentService1= _dependentService1_;
dependentService= _dependentService_;
spyOn(dependentService1,'setPath');
spyOn(dependentService,'get');
spyOn($q,'all').and.callFake(function(){
var deferred = _$q_.defer();
if($q.all.calls.count() === 1){
deferred.resolve([{path:'./abcd'}]);
}else if($q.all.calls.count() === 2){
deferred.resolve([{path:'./abcd','user': {'userId':'xyz',
'groups':['G1']}}]);
}else{
deferred.resolve({});
}
return deferred.promise;
});
}));
it('should load path, information',function(){
var promise = myService.load();
rootScope.$apply();
expect(dependentService.get).toHaveBeenCalled();
expect(dependentService1.setPath).toHaveBeenCalledWith('./abcd');
});
});
А вот мой MyService.js
'use strict';
function myService($q,dependentService1,dependentService){
var appConfigLoaded = false;
function _loadPath(){
return dependentService.get(dependentService1.url);
}
return {
load : function(){
var loadPath = _loadPath(),
finalDeferred = $q.defer();
$q.all([loadPath ]).then(function (results) {
var path = results[0].path ,
user = results[0].user;
dependentService1.setPath(path);
$q.all([_loadDataPromise1(),_loadDataPromise2()]).then(function(results){
finalDeferred.resolve(results);
},function(reason){
finalDeferred.reject(reason);
});
},function(reason){
finalDeferred.reject(reason);
});
return finalDeferred.promise;
}
};
}
angular.module('myModule.myConfig').service('myService', MyService);
Следующие функций и услуг, которые держат их опущены для краткости, но они возвращают обещание. Я тоже шпионил их, так же как и другие две службы.
loadDataPromise1() and loadDataPromise1()
Теперь я получаю некоторые ошибки, как Неожиданное запроса GET с URL, который указывает на какой-то headers.template.html. Но я даже не звоню на http, чтобы получить такой шаблон, ни какие-либо функции. которые когда-либо называли $ http.get, я их шпионил.
Я попытался с
$httpBackend.flush();
но та же ошибка происходит. Может быть, я делаю что-то основное в неправильном ключе.
Если я удалю $rootScope.apply()
, тогда ошибка исчезнет. Однако функция .then() в моем сервисе, связанная с первым вызовом $q.all()
, не вызывается.
Любые указатели, чтобы помочь мне?
Я использую ui-router. Могу ли я просто использовать $ httpBackend.flush(), прежде чем я вызову $ rootScope.apply() без написания каких-либо ожидающих * операторов? Я попытался с вашим решением, но затем обнаружил какой-то другой путь запроса и выдает неожиданную ошибку запроса для этого запроса. Могу ли я просто использовать regex для expect * и возвращать некоторый фиктивный ответ для всех из них, как для всех get, post, delete, patch, put type запросов Я верну фиктивные данные, а затем flush() их перед вызовом $ rootScope.apply ()? –