Angular 带间隔的角度测试()

Angular 带间隔的角度测试(),angular,angular9,angular-test,Angular,Angular9,Angular Test,在我的ngOnInit中,我检查路线,做一些事情,然后设置一个间隔 ngOnInit():void{ this.routeSubscription=this.route.paramMap.subscribe(x=>{ ... //每60秒重新加载一次数据 间隔(60_000) .pipe(takeUntil(此.cancelInterval$)) .subscribe(()=>this.rows$=this.orderService.active()) }) } 当我尝试进行单元测试时,jas

在我的
ngOnInit
中,我检查路线,做一些事情,然后设置一个
间隔

ngOnInit():void{
this.routeSubscription=this.route.paramMap.subscribe(x=>{
...
//每60秒重新加载一次数据
间隔(60_000)
.pipe(takeUntil(此.cancelInterval$))
.subscribe(()=>this.rows$=this.orderService.active())
})
}
当我尝试进行单元测试时,jasmine中止了,因为异步方法返回的速度不够快。我正在这样做(作为主测试的子描述,它执行所有正常的
TestBed
设置):

description('显示活动订单时',()=>{
在每个之前(()=>{
activatedRoute.setParamMap({})
fixture.detectChanges()
})
它(“…”,异步()=>{
等待fixture.whenStable()
...
})
它似乎因为间隔而被卡住了。我想我可以在每个方法之前的
末尾调用
discardPeriodicTasks()
,但这不起作用

因此,我正在寻找一种在测试中处理这个问题的正确方法,或者在生产代码中寻找一种仅在不通过测试运行的情况下进行interval调用的方法

角度CLI:9.0.7
节点:14.4.0

Angular:9.1.6

不要直接调用RXJS
interval()
,而是创建一个简单的中间服务,如下所示:

import { Injectable } from '@angular/core';
import { interval } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class TimerService {

  interval(ms: number) {
      return interval(ms);
  }

}
在组件中注入并使用它:
timer.interval(60_000)

现在,在单元测试中模拟
interval()
的必要行为是很简单的,例如:

providers: [{ provide: TimerService, useValue: { interval: () => of(1) } }],
您可以使用和勾选来模拟异步行为


it(“…”,fakeAsync()=>{tick(60000);doTestStuff();})

据我所知,这是行不通的。interval()的问题是它会不断地安排下一个超时,而单元测试框架会一直等到所有打开的超时完成。好吧,我希望组件上会出现一个Ngondestry,它会关闭intervall(this.cancelInterval$)将在成功断言后调用。。