2015-11-26 1 views
0

После моего 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(), не вызывается.

Любые указатели, чтобы помочь мне?

ответ

0

У вас есть маршрут по умолчанию с шаблономURL в вашей маршрутизации приложения? Вы, вероятно, работает в этот вопрос:
https://github.com/angular/angular.js/issues/2717

Обходной (что раздражает), чтобы положить expectGET для templateURL в вашем beforeEach, а затем промойте его.

$httpBackend.expectGET('path/to/template/defaulttemplate.html').respond(200, ''); 
$httpBackend.flush(); 

Вы можете сделать это где-нибудь там - я стараюсь и держать его в верхней или нижней части, так что очевидно, что это временное решение, а не часть коды тестирования. Обратите внимание, что вам придется помещать эти строки в КАЖДЫЙ тестовый файл, поскольку маршрутизация является частью приложения (а не тестируемого модуля).

+0

Я использую ui-router. Могу ли я просто использовать $ httpBackend.flush(), прежде чем я вызову $ rootScope.apply() без написания каких-либо ожидающих * операторов? Я попытался с вашим решением, но затем обнаружил какой-то другой путь запроса и выдает неожиданную ошибку запроса для этого запроса. Могу ли я просто использовать regex для expect * и возвращать некоторый фиктивный ответ для всех из них, как для всех get, post, delete, patch, put type запросов Я верну фиктивные данные, а затем flush() их перед вызовом $ rootScope.apply ()? –

Смежные вопросы