2017-03-22 133 views
1

我正在嘗試設置一個setInterval調用的測試。 setInterval的總是創建一個新的計時器,這樣無論你如何遙遙領先移動打勾()總是會有這個消息的錯誤:仍在隊列1定時器(S):如何測試使用setInterval使用jasmine的角度服務?

錯誤。

如果我用setInterval覆蓋setTimeout函數,那麼測試按預期通過。我已經添加了代碼,以允許使用通常設置爲setInterval的公共屬性myTimerFunc的角度服務。測試代碼將其設置爲setTimeout。

有沒有更好的方法來測試的setInterval?

這將是很好,如果在隊列中的最後定時器會受茉莉被忽略。然後,我可以測試沒有額外的罪過。

例如,除非您取消覆蓋setInterval的行的註釋,否則此代碼將失敗。我不介意在測試代碼中執行此操作,但我希望避免將額外的東西添加到普通代碼中以允許此重寫。

import { fakeAsync, tick } from '@angular/core/testing' 
 
describe('testing setTimeout and setInterval:',() => { 
 
it('setTimeout should work', fakeAsync(() => { 
 
    let callback = jasmine.createSpy('setTimeoutCallback') 
 
    setTimeout(() => { 
 
    callback() 
 
    }, 55) 
 
    tick(56) 
 
    expect(callback).toHaveBeenCalled(); 
 
})); 
 
// let setInterval = setTimeout 
 
it('setInterval should work', fakeAsync(() => { 
 
    let callback = jasmine.createSpy('setTimeoutCallback') 
 
    setInterval(() => { 
 
    callback() 
 
    }, 55) 
 
    tick(56) 
 
    expect(callback).toHaveBeenCalled(); 
 
})); 
 
})

回答

0

如果包裹在一個服務setInterval,你可以嘲笑服務,一切都將是確定性的,且無副作用。基本上,你只是做類似

class IntervalService { 

    setInterval(callback:() => void, interval: number) { 
    return setInterval(callback, interval); 
    } 

    clearInterval(intervalId: number) { 
    clearInterval(intervalId); 
    } 
} 

你可以嘲笑它是通過執行類似

class MockIntervalService { 
    callback; 

    setInterval(callback:() => any, interval: number) { 
    this.callback = callback; 
    return 1; 
    } 

    clearInterval(interval: number) { 
    callback = undefined; 
    } 

    tick() { 
    callback(); 
    } 
} 

然後在你測試的方式,你可以通過在模擬服務調用tick控制區間。最好的部分是一切都是同步的,使測試更容易推理。

注入服務有點額外的工作,但我認爲這不是一個負擔。

+0

謝謝。我同意你的建議不是什麼負擔,特別是因爲我正在考慮限制setInterval重複的次數(而不是讓它變成前後) –

相關問題