2017-01-06 15 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コールバックを使用する必要はありません。

それは約束がダイジェストが実行された後の約束のthencatchfinallyコールバックのみが実行されることを意味ダイジェストサイクルに結びついていることを知ることも重要です。

あなたは多くの変更は必要ありません:あなたはあなたの例ではdoneコールバックを削除するとき何が起こっ

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(); 
}); 

をスペックは任意の待ち時間なしで実行するというものであったが、約束のコールバック関数が実行されないだろう、期待値は決して実行されず、テストは成功します(約束のコールバックの外にexepctがないので)。