2017-01-06 6 views
0

"- POD 생성으로 PDF 파일 반환"스펙을 얻는 방법을 찾지 못했습니다. 테스트가 불가능해지기 전에 재스민 시간이 초과되었습니다. 수행 콜백 함수는 테스트가 잘 실행하지만 난 그게 긍정적 인 거짓이라고 생각한다.컨트롤러에서의 재스민 테스트 약속

컨트롤러

(function() { 
    'use strict'; 
     angular 
      .module('app.controllers') 
      .controller('podController', podController); 

     podController.$inject = ['podService','$window']; 

     function podController(podService,$window) { 
      var vm = this; 

      vm.generatePOD = generatePOD; 
      vm.downloadPDF = downloadPDF; 
      vm.openPDF = openPDF; 

      ///////////// 

      function downloadPDF(willCallId){ 
       var fileName = 'pod-' + willCallId; 
       generatePODFile(willCallId).then(function(file){ 
        openPDF(file,fileName); 
       }); 
      } 

      function generatePOD(willCallId) { 
       return podService.getPOD(willCallId).then(function(data){ 
        var byteCharacters = atob(data); 
        var byteNumbers = new Array(byteCharacters.length); 
        for (var i = 0; i < byteCharacters.length; i++) { 
         byteNumbers[i] = byteCharacters.charCodeAt(i); 
        } 
        var byteArray = new Uint8Array(byteNumbers); 
        var file = new Blob([byteArray], {type: 'application/pdf'}); 
        return file; 
       }); 
      } 

      function openPDF(file,fileName){ 
       var fileURL = $window.URL.createObjectURL(file); 
       $window.open(fileURL,fileName); 
      } 
     } 
})(); 

서비스

(function() { 
    'use strict'; 
     angular 
      .module('app.services') 
      .service('podService', podService); 

     podService.$inject = ['IEHRestangular']; 

     function podService(IEHRestangular) { 

       var service = { 
        getPOD: getPOD 
       }; 

       return service; 

       /////////////////////// 

       function getPOD(willCallId) { 
        return IEHRestangular.one('/ClientEventNotification/api/POD/').customGET('GetPOD', {'willcallid': willCallId},{responseType: 'arraybuffer'}).then(function (data) { 
         return data; 
        }); 
       } 
      } 

})(); 
,

컨트롤러 테스트 스위트

describe('POD Controller Test', function() { 
    beforeEach(module('app')); 

    beforeEach(module(function($urlRouterProvider) { 
     $urlRouterProvider.deferIntercept(); 
    })); 


    var $controller,$window,podService,$q,vm,deferred; 

    beforeEach(inject(function (_$controller_,$window,_podService_,$q,$timeout){ 
     deferred = $q.defer(); 
     $controller = _$controller_; 
     $window = $window; 
     $timeout = $timeout; 
     podservice = _podService_; 
     $q = $q; 
     vm = $controller('podController', {'$window': $window, podservice:podService}); 
    })); 


    it(' - Generate POD returns a PDF File', function (done) { 
     var willcallid = 3265987; 
     deferred.resolve('resolveData'); 
     spyOn(podservice, 'getPOD').and.returnValues(deferred.promise); 
     vm.generatePOD(willcallid).then(function(data){ 
      expect(data).toBe((data instanceof Blob)); 
      expect(podservice.getPOD).toHaveBeenCalledWith(willcallid); 
done(); 
     }); 
    }); 

    it(' - Opens a window displaying a PDF File', inject(function($window) { 
     spyOn($window, 'open').and.callFake(function() { 
      return true; 
     }); 
     var byteArray = new Uint8Array(1024); 
     var file = new Blob([byteArray], {type: 'application/pdf'}); 
     vm.openPDF(file,'testFile'); 
     expect($window.open).toHaveBeenCalled(); 
    })); 

}); 
+0

이 기능을 사용하셨습니까? – tasseKATT

답변

0

시험 중에 흐름을보다 제어 할 수 있도록 동기 방식으로 제어 할 수있는 버전으로 대체 ngMock 많은 서비스를 사용. 즉, 대부분의 경우 Jasmine done 콜백을 사용할 필요가 없습니다.

이 약속은 다이제스트를 실행 한 후 약속의 then, catchfinally 콜백 만 실행되는 것을 의미 다이제스트주기에 연결되어 있음을 아는 것도 중요합니다.

필요하지 않은 많은 변화 :

it(' - Generate POD returns a PDF File', function() { 

    var willcallid = 3265987; 

    spyOn(podservice, 'getPOD').and.returnValue(deferred.promise); 

    vm.generatePOD(willcallid).then(function (data) { 

    expect(podservice.getPOD).toHaveBeenCalledWith(willcallid); 
    expect(data instanceof Blob).toBe(true); 
    }); 

    deferred.resolve('resolveData'); 

    // Trigger the digest loop and resolution of promise callbacks 
    $rootScope.$digest(); 
}); 

당신이 당신의 예에서 done 콜백을 제거했을 때 어떤 현상이 발생은 사양이 어떤 대기없이 실행할 것이라고했지만, 약속 콜백 기능이 실행되지 않을 것입니다 예상은 결코 실행되지 않으며 테스트는 통과 할 것입니다 (약속 콜백 외부에 exepct가 없기 때문에).