2013-08-09 1 views
2

내 서비스에 HTTP 요청을 취소하여 구현 "보류중인 요청을 플러시 없습니다"가 발생하고 나는 그것을 테스트하려는 : 내가 얻고 그것을 실행하면 다음

angular.module('EmsWeb.Services').factory('DalService', ['$q', '$http', 'AppModel', 'DalRequestCache', function ($q, $http, appModel, dalRequestCache) { 
    return { 
     apiUrl: '../api/ModuleApi/', 
     viewUrl: '../', 
     submitRequestPromise: function (senderIdentifier, url, requestData) {      
      this.cancelRequest(senderIdentifier); 
      var canceler = $q.defer(); 
      this.addToCache(senderIdentifier, canceler); 
       return $http({ 
        method: 'POST', 
        url: url,     
        data: requestData?requestData:null, 
        timeout: canceler.promise 
       });   
     }, 
     addToCache: function (senderIdentifier, canceler) { 
      var request = { 'senderIdentifier': senderIdentifier, 'cancelPromise': canceler }; 
      dalRequestCache.put(senderIdentifier, request); 
     }, 
     cancelRequest: function (senderIdentifier) { 
      var request = dalRequestCache.get(senderIdentifier); 
      if (request) { 
       request.cancelPromise.resolve('canceled'); 
       dalRequestCache.remove(senderIdentifier); 
       return true; 
      } 
      return false; 
     }, 
getModules: function (senderIdentifier, appContext, successFn, errorFn) { 
      var url = this.apiUrl + 'GetModules'; 
      var ctx = appModel.context.toRequestContext(appContext); 
      this.submitRequest(senderIdentifier, url, ctx, successFn, errorFn); 
     } 
}; 
}]); 

테스트

describe("Unit: Testing Services", function() { 

    beforeEach(angular.mock.module('EmsWeb.Services')); 
    describe("Unit: DalService", function() { 
     var $httpBackend, dalService, appModel; 
     beforeEach(inject(function ($q, _$httpBackend_, AppModel, DalService) { 
      dalService = DalService; 
      appModel = AppModel; 
      $httpBackend = _$httpBackend_; 
      $httpBackend.when('POST', '../api/ModuleApi/GetModules').respond({ userId: 'userX', 'A-Token': 'xxx' });    
      appModel.context.company = { code: 'LPL' }; 

     })); 

     describe("canceling requests", function() {    
      it('checks request should be canceled ', function() { 

       var returnedData; 
       var callBackFn = function (data) { 
        returnedData = data; 
       }; 
       dalService.getModules('senderIdentifier', appModel.context, callBackFn, callBackFn); 

       var canceled = dalService.cancelRequest('senderIdentifier'); 
       $httpBackend.flush(); 
       expect(canceled).to.be.true; 
       expect(returnedData).to.undefined; 
      }); 

     }); 

     afterEach(function() {  
      $httpBackend.verifyNoOutstandingRequest(); 
     }); 
    }); 

입니다 "대기 요청 없음"오류. 내가 전화를 걸지 않으면 해당 요청이 확실히 취소되는지 테스트 할 수 있습니까?

가 대신 $httpBackend.flush()를 호출, 알렉산더

답변

4

감사, $rootScope.$digest()를 호출합니다. 그러면 비동기 작업 (예 : 약속)이 강제로 호출되며 요청이 취소되었으므로 플러시 할 http 요청이 없습니다. 여기에 주어진 코드 예제에서는 이것을 테스트하지 않았지만 내 경우에는 효과가있었습니다.

관련 문제