在角度文档中,我看到了tick()
和flush()
这两个函数。两者似乎都做类似的事情。从角度文档中,它会打勾:
为fakeAsync区域中的计时器模拟异步时间流逝。
冲洗:
通过耗尽宏任务队列直到其为空来模拟fakeAsync区域中计时器的异步时间流逝。返回的值是经过的毫秒数。
有人可以向我解释差异吗?
编辑(在评论中回答):
此外,在angular documentation tick()
中使用时不带参数,并且该行上的注释甚至使用了短语“ flush”
it('should display error when TwainService fails', fakeAsync(() => {
// tell spy to return an error observable
getQuoteSpy.and.returnValue(
throwError('TwainService test failure'));
fixture.detectChanges(); // onInit()
// sync spy errors immediately after init
tick(); // flush the component's setTimeout()
fixture.detectChanges(); // update errorMessage within setTimeout()
expect(errorMessage()).toMatch(/test failure/, 'should display error');
expect(quoteEl.textContent).toBe('...', 'should show placeholder');
}));
答案 0 :(得分:3)
相对于先前启动的异步操作,它们执行不同的操作。例如;调用setTimeout(...)
将启动异步操作。
tick()
向前移动时间。flush()
将时间移到末尾。通过这些功能的单元测试可以更好地说明这一点。
此单元测试显示了滴答声正在用于逐步向前移动时间,直到所有 10 计时器结束。刻度线被多次调用。
https://github.com/angular/angular/blob/master/packages/core/test/fake_async_spec.ts#L205
it('should clear periodic timers', fakeAsync(() => {
let cycles = 0;
const id = setInterval(() => { cycles++; }, 10);
tick(10);
expect(cycles).toEqual(1);
discardPeriodicTasks();
// Tick once to clear out the timer which already started.
tick(10);
expect(cycles).toEqual(2);
tick(10);
// Nothing should change
expect(cycles).toEqual(2);
}));
此单元测试表明,所有异步任务在返回时都应完成,并且返回的值告诉您完成它们需要多长时间。
https://github.com/angular/angular/blob/master/packages/core/test/fake_async_spec.ts#L273
it('should flush multiple tasks', fakeAsync(() => {
let ran = false;
let ran2 = false;
setTimeout(() => { ran = true; }, 10);
setTimeout(() => { ran2 = true; }, 30);
let elapsed = flush();
expect(ran).toEqual(true);
expect(ran2).toEqual(true);
expect(elapsed).toEqual(30);
}));