如何模拟在angularJs 1.x中返回promise的工厂

时间:2017-06-11 08:18:13

标签: angularjs unit-testing

我有一个从$ http

返回承诺的工厂
angular.module('app.core')
    .factory('dataService', dataService);
dataService.$inject = ['$http'];
function dataService($http){
    return $http.get('/getLocalSession')
        .then(function(response){
            return response.data;
        });
}

以下是使用上述工厂的另一项服务

angular.module('app.core')
    .service('analytics', analytics);
analytics.$inject = ['dataService'];
function analytics(dataService){
    dataService.then(function(data){
        //do something with data
    });
}

以下是分析服务的测试

describe('analytics service', function(){
    var analytics, $q, dataService, $rootScope;
    var testLanId = 'user001';
    beforeEach(module('app.core'));
    beforeEach(module({
        dataService: $q.when({
            lanId: testLanId
        })
    }));
    beforeEach(inject(function(_analytics_, _$q_, _$rootScope_){
        analytics = _analytics_;
        $q = _$q_;
        $rootScope = _$rootScope_;
    }));

    it('expect it to do something', function(){
        $rootScope.$apply();
        //expect specs
    });
});

但是这不起作用,因为在调用注入之前没有定义$ q。 我已经看到了这个post,但是他们有一个服务返回一个返回一个promise的函数。

我们如何模仿工厂回复承诺?

1 个答案:

答案 0 :(得分:0)

使用angular.mock.module的函数参数并提供$ q作为依赖项。

beforeEach(module(function($provide){
    $provide.factory('dataService', function($q){
        return $q.when({lanId: testLanId});
    });
}));