在angularJS中实现Promises

时间:2015-03-12 20:25:55

标签: angularjs unit-testing testing

我正在尝试在角度服务中实现一些http.get()请求,返回一个promise。

以下是我最初服务的摘录:

angular.module('dashboard').service('DashboardHTTP', ['$q', '$http', function ($q, $http) {

    this.get_info = function () {
        var deferred = $q.defer();
        $http.get('/dashboard/4/api/info', { cache: true }).success(function (data) {
            deferred.resolve(data);
        }).error(function () {
            deferred.reject('Could Not Complete Request');
        });
        return deferred.promise;
    }
}]);

以下是我控制器中我称之为服务部分的摘录:

DashboardHTTP.get_info().then(
   function (response) {
       var resp = response;
       $rootScope.dash_info = resp;
   },
   function (response) {
       return 'error';
   },
   function (response) {
       return 'notify';
   });

我的问题:

  1. 我正在努力确定像这样的互动需要多少测试。我目前正在进行以下测试,即在服务级别进行测试,但我想知道是否需要在控制器级别进行测试,如果需要,需要进行哪种测试?

    beforeEach(inject(function (_$httpBackend_, $injector) {
        service = $injector.get('DashboardHTTP');
        $httpBackend = _$httpBackend_;
    }));
    
    afterEach(function () {
        $httpBackend.verifyNoOutstandingExpectation();
        $httpBackend.verifyNoOutstandingRequest();
    });
    
    describe('get_info', function () {
        it(' should get info from the url /api/info', function () {
            var returnData = { data: 'lots of data' };
            $httpBackend.expectGET('/dashboard/4/api/info').respond(returnData);
    
            var returnedPromise = service.get_info();
    
            var result;
            returnedPromise.then(function (response) {
                result = response;
            });
    
            $httpBackend.flush();
    
            expect(result).toEqual(returnData);
        });
    });
    
  2. 我的目标是我想将$rootScope.dash_info设置为Service.get_info()发出的HTTP请求的响应。我的控制器中的实现是否合适?如果是这样,我如何测试在控制器级别传递正确的数据?

1 个答案:

答案 0 :(得分:0)

这可能是部分答案,但这是我的意见:

您的通话是异步的,因此您的测试应该是。使用done

it(' should get info from the url /api/info', function (done) {
    var returnData = { data: 'lots of data' };
    $httpBackend.expectGET('/dashboard/4/api/info').respond(returnData);

    var returnedPromise = service.get_info();

    var result;
    returnedPromise.then(function (response) {
        result = response;

        expect(result).toEqual(returnData);

        done();
    });

    $httpBackend.flush();
});

另外,你知道http.get会返回一个承诺,对吧?它还有successerror个函数,但它仍然是一个承诺。