【问题标题】:AngularJs Jasmine Unit test fails with Unexpected RequestAngularJs Jasmine 单元测试因意外请求而失败
【发布时间】:2015-11-26 12:18:50
【问题描述】:

以下是我的 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()  

现在我收到一些错误,例如 Unexpected request GET with URL,它指向一些 headers.template.html。但我什至没有调用 http 来获取这样的模板,也没有任何功能。曾经调用 $http.get 我已经监视了他们。

我试过了

$httpBackend.flush();

但发生同样的错误。可能是我以错误的方式做一些基本的事情。

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

有什么可以帮助我的吗?

【问题讨论】:

    标签: javascript angularjs unit-testing jasmine angularjs-q


    【解决方案1】:

    您的应用程序路由中是否有带有 templateURL 的默认路由?您可能遇到了这个问题:
    https://github.com/angular/angular.js/issues/2717

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

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

    您可以在其中的任何位置执行此操作 - 我尝试将其保持在顶部或底部,因此很明显这是一种解决方法,而不是测试代码的一部分。请注意,您必须将这些行放在每个测试文件中,因为路由是应用程序的一部分(而不是被测模块)。

    【讨论】:

    • 我正在使用 ui-router。我可以在调用 $rootScope.apply() 之前使用 $httpBackend.flush() 而不编写任何 expect* 语句吗?我尝试了您的解决方案,但随后显示了一些其他请求路径并为该请求引发了意外的请求错误。我可以只对期望*使用正则表达式并为所有这些请求返回一些虚拟响应,例如所有 get、post、delete、patch、put 类型的请求我将返回虚拟数据,然后在调用 $rootScope.apply( )?
    猜你喜欢
    • 1970-01-01
    • 2015-11-12
    • 2013-07-06
    • 2014-11-27
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2013-07-28
    • 2013-08-29
    相关资源
    最近更新 更多