AngularJS,Jasmine测试承诺无法解决

时间:2015-09-22 14:22:24

标签: javascript angularjs

我的承诺无法在我的测试中解决。我有两项服务。

1- ServerApiService ,通常会调用服务器:

angular.module('test').service('serverApiService', ['$http', function($http) {
    var self = this;

    self.generateRequest = function(actionName, data) {
        console.log('request generated');
        //normally returns 'return $http(config);'
    };

}]);

2-第二项服务使用ServerApiService,并管理解决方案 SolutionService

angular.module('test').service('solutionService', ['$q', 'serverApiService', function($q, serverApiService) {
    var self = this;

    self.list = function(account) {
        var data = {
          id: account.id
        };

        var deferred = $q.defer();

        serverApiService.generateRequest('solutions.list', data).then(function(response) {
            var solutions = [];

            for(var i = 0; i < response.Items.length; i++) {
                var solutionJSON = response.Items[i];
                var studyJSON = solutionJSON.Study;

                var solution = {};
                solution.id = solutionJSON.Id;

                var study = {};
                study.name = studyJSON.Name;


                solution.study = study;
                solutions.push(solution);
            }

            deferred.resolve(solutions);
        });

        return deferred.promise;
    };

}]);

测试问题

我想测试SolutionService模块,所以我创建了一个ServerApiService的模拟,但我无法让spy函数返回promise,我不知道为什么:

describe('solution service', function () {

    var mockServerApiService, solutionSvc;

    beforeEach(function() {
        module('test');
    });

    beforeEach(function() {
        module(function($provide) {
            $provide.service('serverApiService', function($q) {
                this.generateRequest = jasmine.createSpy('generateRequest').and.callFake(function(actionName, data) {
                    var deferred = $q.defer();

                    deferred.resolve({Items: [
                      {
                        Id: '910759',
                        Study: {
                          Id: '213123',
                          Name: 'test'
                        },
                      },
                      {
                        Id: '4406510',
                        Study: {
                          Id: '063294',
                          Name: 'test2'
                        },
                      }, 
                      ]});

                    return deferred.promise;
                });
            });
        });

    });



    beforeEach(inject(function (serverApiService, solutionService) {
        mockServerApiService = serverApiService;
        solutionSvc = solutionService;
    }));


    it('should return all the solutions', function(done) {
        var account = {};
        account.id = 'test@test.com';
        solutionSvc.list(account).then(function(solutions) {
            expect(solutions.length).toBe(2);
            done();
        });

        expect(mockServerApiService.generateRequest).toHaveBeenCalled();

    })



});

基本上,从不调用SolutionService中的then部分:

serverApiService.generateRequest('solutions.list', data).then(function(response) {
                //Never called
});

以下是情况的一部分:http://plnkr.co/edit/gMyaOpfczBmt9HhwzI9m?p=preview

1 个答案:

答案 0 :(得分:5)

您需要启动角度摘要才能解决承诺。我通过注入一个新的示波器并在测试中调用apply来解决你的问题。见这里:http://plnkr.co/edit/Nrlg7KwfwTNJW3gpAG1m

var mockServerApiService, solutionSvc, scope;

    beforeEach(function() {
        module('test');
    });

    beforeEach(function() {
        module(function($provide) {
            $provide.service('serverApiService', function($q) {
                this.generateRequest = jasmine.createSpy('generateRequest').and.callFake(function(actionName, data) {
                    var deferred = $q.defer();

                    deferred.resolve({Items: [
                      {
                        Id: '910759',
                        Study: {
                          Id: '213123',
                          Name: 'test'
                        },
                      },
                      {
                        Id: '4406510',
                        Study: {
                          Id: '063294',
                          Name: 'test2'
                        },
                      }, 
                      ]});

                    return deferred.promise;
                });
            });
        });

    });



    beforeEach(inject(function (serverApiService, solutionService, $rootScope) {
        mockServerApiService = serverApiService;
        solutionSvc = solutionService;
        scope = $rootScope.$new();
    }));