我正在使用Angular版本「4.2.2」,Angular Cli版本爲「1.1.1」, zone.js 0.8.12。其中一些是用於工作,要麼在Chrome和PhanthomJS現在用下面的錯誤而失敗我的單元測試:測試未捕獲錯誤:macroTask'setInterval':無法轉換到'正在運行',期望狀態'已計劃','未計劃'
ERROR 未捕獲的錯誤:宏任務「的setInterval」:不能轉換到「跑步」,希望國家「計劃」,是'不定期'。
任何人都看過這些錯誤,並知道如何解決它們?
我正在使用Angular版本「4.2.2」,Angular Cli版本爲「1.1.1」, zone.js 0.8.12。其中一些是用於工作,要麼在Chrome和PhanthomJS現在用下面的錯誤而失敗我的單元測試:測試未捕獲錯誤:macroTask'setInterval':無法轉換到'正在運行',期望狀態'已計劃','未計劃'
ERROR 未捕獲的錯誤:宏任務「的setInterval」:不能轉換到「跑步」,希望國家「計劃」,是'不定期'。
任何人都看過這些錯誤,並知道如何解決它們?
好了,所以一些研究之後,我發現,大多數人(甚至是角人),說自己在使用的代碼async
或fakeAsync
,涉及到intervalTimer
(與可觀察的方法常見的),根本無法做到的。
,我發現,這是在this link
例如,我測試與在Angular2文檔闡明的fakeAsync
和tick
技術可觀察到的方法,並運行到該錯誤。 (見下面的測試)
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」,然後訂閱它的最近通話服務。然後你有熟悉的訂閱語法,以檢查錯誤並檢查是否成功。
供參考,是窺視注入服務的步驟如下:
describe
方法是一樣的類型,你想服務的頂部添加一個變量間諜,即。 let casemaskService: CaseMaskService;
describe
方法,其類型jasmine.Spy
的頂部創建一個變量,即let casemaskServiceSpy: jasmine.Spy;
fixture
的注入相同類型的服務,即casemaskService = fixture.debugElement.injector.get(CaseMaskService);
。在您的任何規格的(我通常這樣做是同步beforeEach
法)spy
變量等於spyOn
實例,並告訴它返回,即caseMaskSpy = spyOn(casemaskService, 'updateCaseMask').and.returnValue(Observable.of(
$ {} mockCaseMask.caseMaskingId被更新! , Scheduler.async));
在這一點上,你可以使用我粘貼上面的代碼,應該是很好的去。
我得到相同的錯誤。我提到[此鏈接](https://github.com/angular/zone.js/issues/657),並提到將zone.js升級到0.8.11。我做到了,沒有結果。目前還沒有看到更多。 – OysterMaker