2017-03-22 145 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重复的次数(而不是让它变成前后) –

相关问题