2016-04-27 4 views
1

У меня есть service factory, который соединяет и взаимодействует с api для данных. Вот служба:сервисное обещание не разрешается с кармой

angular.module('dbRequest', []) 
    .factory('Request', ['$http', 'localConfig', function($http, localConfig){ 
    return { 
     getDataRevision: function(){ 
     return $http({ 
      url: localConfig.dbDataUrl, 
      method: "GET", 
      crossDomain: true, 
      headers: { 
      'Content-Type': 'application/json; charset=utf-8' 
      } 
     }) 
     } 
    } 
    }]); 

Принимая сигналы от this answer, Это как я тестирование метода:

describe('Service: Request', function() { 
    var $scope, srvMock, $q, lc, $httpBackend; 

    beforeEach(module('webApp')); 

    beforeEach(inject(function($rootScope, Request, _$q_, _$httpBackend_, localConfig){ 
    $scope = $rootScope.$new(); 
    srvMock = Request; 
    $q = _$q_; 
    $httpBackend = _$httpBackend_; 
    lc = localConfig; 

    $httpBackend.expect('GET', lc.dbDataUrl); 

    $httpBackend.when('GET', lc.dbDataUrl).respond({ 
     success: ["d1","d2", "d3"] 
    }); 
    })); 

    it('should return a promise', function(){ 
    expect(srvMock.getDataRevision().then).toBeDefined(); 
    }); 

    it('should resolve with data', function(){ 
    var data; 
    var deferred = $q.defer(); 
    var promise = deferred.promise; 

    promise.then(function(res){ 
     data = res.success; 
    }); 

    srvMock.getDataRevision().then(function(res){ 
     deferred.resolve(res); 
    }); 

    $scope.$digest(); 

    expect(data).toEqual(["d1","d2", "d3"]); 
    }) 
}); 

should return a promise пассы, но следующий should resolve with data терпит неудачу с этой ошибкой:

Expected undefined to equal [ 'd1', 'd2', 'd3' ]. 

Тем не менее, метод servicegetDataRevision получает вызов, но не может быть разрешен путем ложного обещания i n тест. Как внести исправление?

ответ

1

В настоящее время вы надеетесь издевались данные, чтобы быть там в data переменной без промывки httpRequest с, но этого не произойдет, пока вы flush все httpRequest с. То, что делает $httpBackend.flush(), это, он возвращает макет данных в тот конкретный запрос, который вы сделали с помощью $httpBackend.when('GET', lc.dbDataUrl).respond.

Кроме того, вам не нужно создавать дополнительное обещание, которое было бы накладным. Вместо того, чтобы иметь пользовательское обещание, вы могли бы использовать функцию обслуживания, которую обещали, как показано ниже.

Код

it('should resolve with data', function(){ 
    var data; 

    srvMock.getDataRevision().then(function(res){ 
     data = res.success; 
    }); 

    $scope.$digest(); 
    $httpBackend.flush(); //making sure mocked response has been return 
    //after .then evaluation only below code will get called. 
    expect(data).toEqual(["d1","d2", "d3"]); 
}) 
+0

решение отлично работает! Однако не возражаете ли вы объяснить, как выполняется тестовый пример? Поскольку ответ «httpbackend success» всегда будет равен «ожидаемым данным»? Другими словами, как (я/должен ли я) тестировать «ответ», возвращенный из сервиса «обещание»? – faizanjehangir

+0

@faizanjehangir Я сделал это .. посмотрю на обновление .. –

Смежные вопросы