Javascript AngularJs Jasmine单元测试因意外请求而失败

Javascript AngularJs Jasmine单元测试因意外请求而失败,javascript,angularjs,unit-testing,jasmine,angularjs-q,Javascript,Angularjs,Unit Testing,Jasmine,Angularjs Q,以下是我的myService.spec.js: 'use strict'; describe('myService', function () { var dependentService,dependentService1,rootScope,$q; beforeEach(module('myModule.myConfig')); beforeEach(module('myModule')); beforeEach(inject(function

以下是我的myService.spec.js:

   '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()  
现在我遇到了一些错误,比如使用URL获取指向某些headers.template.html的意外请求。但我甚至没有调用http来获取这样的模板,也没有调用任何函数。他们打过$http.get,我发现了他们

我试过了

$httpBackend.flush();
但同样的错误也会发生。可能是我做错了一些基本的事情

若我删除
$rootScope.apply()
,那个么错误就会消失。但是,我的服务中附加到对
$q的第一次调用的.then()函数。不会调用all()


有什么可以帮我的吗

在应用程序路由中是否有带有templateURL的默认路由?您可能遇到了这个问题:

解决方法(这很烦人)是在每个之前的
中为templateURL放置一个
expectGET
,然后刷新它

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

您可以在那里的任何地方进行测试-我尝试将其保持在顶部或底部,因此很明显这是一种变通方法,而不是测试代码的一部分。注意,由于路由是应用程序的一部分(而不是测试中的模块),您必须将这些行放入每个测试文件中。

我使用的是ui路由器。在调用$rootScope.apply()之前,是否可以只使用$httpBackend.flush(),而不编写任何expect*语句?我尝试使用您的解决方案,但随后显示了其他一些请求路径,并为该请求抛出意外的请求错误。我可以只对expect*使用regex并为所有请求返回一些伪响应吗?比如所有get、post、delete、patch、put类型的请求。我将返回伪数据,然后在调用$rootScope.apply()之前刷新它们?