2017-06-13 55 views
2

我正在使用Angular版本「4.2.2」,Angular Cli版本爲「1.1.1」, zone.js 0.8.12。其中一些是用於工作,要麼在Chrome和PhanthomJS現在用下面的錯誤而失敗我的單元測試:測試未捕獲錯誤:macroTask'setInterval':無法轉換到'正在運行',期望狀態'已計劃','未計劃'

ERROR 未捕獲的錯誤:宏任務「的setInterval」:不能轉換到「跑步」,希望國家「計劃」,是'不定期'。

任何人都看過這些錯誤,並知道如何解決它們?

+0

我得到相同的錯誤。我提到[此鏈接](https://github.com/angular/zone.js/issues/657),並提到將zone.js升級到0.8.11。我做到了,沒有結果。目前還沒有看到更多。 – OysterMaker

回答

0

好了,所以一些研究之後,我發現,大多數人(甚至是角人),說自己在使用的代碼asyncfakeAsync,涉及到intervalTimer(與可觀察的方法常見的),根本無法做到的。

,我發現,這是在this link

例如,我測試與在Angular2文檔闡明的fakeAsynctick技術可觀察到的方法,並運行到該錯誤。 (見下面的測試)

it('#findCaseMasks should show error if error is returned from service', fakeAsync(() => { 
     component.searchCriteria = new CaseMaskModel(1, 1); 
     caseMaskServiceSpy = spyOn(service, 'findCaseMasks').and.returnValue(Observable.throw('error occured', Scheduler.async)); 
     component.findCaseMasks(); 
     expect(component.error).toBeNull; 
     tick(); 
     fixture.detectChanges(); 
     expect(component.error).toEqual('Something went wrong. Please contact helpdesk if the issue persists.'); 
    })); 

上面的測試更改爲您在下面看到的和測試開始工作正常。

it('#findCaseMasks should show error if error is returned from service', (done) => { 
     component.searchCriteria = new CaseMaskModel(1, 1); 
     caseMaskServiceSpy = spyOn(service, 'findCaseMasks').and.returnValue(Observable.throw('error occured', Scheduler.async)); 
     component.findCaseMasks(); 
     expect(component.error).toBeNull; 
     caseMaskServiceSpy.calls.mostRecent().returnValue.subscribe(
      () => { //success 
       //put code here if testing for success 
      }, 
      err => { //error 
       //put code here if testing for error 

       fixture.detectChanges(); 
       expect(component.error).toEqual('Something went wrong. Please contact helpdesk if the issue persists.'); 
       done(); 
      }); 
    }); 

所以基本上你必須窺視那個注入組件與`jasmine.Spy」,然後訂閱它的最近通話服務。然後你有熟悉的訂閱語法,以檢查錯誤並檢查是否成功。

供參考,是窺視注入服務的步驟如下:

  1. describe方法是一樣的類型,你想服務的頂部添加一個變量間諜,即。 let casemaskService: CaseMaskService;
  2. describe方法,其類型jasmine.Spy的頂部創建一個變量,即let casemaskServiceSpy: jasmine.Spy;
  3. 設置服務變量等於fixture的注入相同類型的服務,即casemaskService = fixture.debugElement.injector.get(CaseMaskService);。在您的任何規格的(我通常這樣做是同步beforeEach法)
  4. 在任何時候,只要設置spy變量等於spyOn實例,並告訴它返回,即caseMaskSpy = spyOn(casemaskService, 'updateCaseMask').and.returnValue(Observable.of( $ {} mockCaseMask.caseMaskingId被更新! , Scheduler.async));

在這一點上,你可以使用我粘貼上面的代碼,應該是很好的去。