如何在jasmine测试中模拟RXJS timer()?

如何在jasmine测试中模拟RXJS timer()?,jasmine,rxjs,karma-jasmine,rxjs6,Jasmine,Rxjs,Karma Jasmine,Rxjs6,我有一个角度组件,用于轮询新数据,当我们等待响应时,它会每X秒更新UI中的消息。它通过一个简单的消息字符串数组循环显示 一旦收到正确的数据,我们将导航到相应的页面 this.pollSubscription=计时器(0,pollTimeInSeconds) .烟斗( //将每个可观察到的迭代转换为以秒为单位的间隔 map((count:number)=>count*pollTimeInSeconds), //如果我们低于最长投票时间,请继续 takeWhile((time:number)=>ti

我有一个角度组件,用于轮询新数据,当我们等待响应时,它会每X秒更新UI中的消息。它通过一个简单的消息字符串数组循环显示

一旦收到正确的数据,我们将导航到相应的页面

this.pollSubscription=计时器(0,pollTimeInSeconds)
.烟斗(
//将每个可观察到的迭代转换为以秒为单位的间隔
map((count:number)=>count*pollTimeInSeconds),
//如果我们低于最长投票时间,请继续
takeWhile((time:number)=>timethis.updateCurrentMessage(时间)),
//
switchMap(()=>this.getDataOrError$())
)
.订阅(
//导航到正确的页面
(d:IData)=>此.navigateBasedOnStatus(d),
//如果发生错误,或者可观察对象完成(不应该发生),请导航到错误页面
()=>this.navigateToError(),
()=>this.navigateToError()
);
我想测试这种行为,但我不完全确定如何针对这种情况模拟
计时器。我看到了,但在我的情况下,我无法做到这一点

理想情况下,我希望构造一个类似这样的测试,以确保每条消息都显示出来,并且如果计时器的时间比预期的长,它将循环回到第一条消息:

it('应该随着计时器的变化显示每个状态',fakeAsync(()=>{
勾选(0);
fixture.detectChanges();
expect(debugEl.nativeElement.innerText.trim()).toEqual('messageone');
勾号(1000);
fixture.detectChanges();
expect(debugEl.nativeElement.innerText.trim()).toEqual('messagetwo');
蒂克(2000年);
fixture.detectChanges();
expect(debugEl.nativeElement.innerText.trim()).toEqual(“消息三”);
//等等。。。
}));

编辑根据下面的一些评论,我正在尝试对其进行测试,但这仍然不起作用

let timerTick:(毫秒:数字)=>void;
在每个之前(()=>{
设fakeNow=0;
timerTick=(毫秒数):void=>{
fakeNow+=毫秒;
滴答声(毫秒);
};
asyncScheduler.now=():number=>fakeNow;
});
之后(()=>{
删除asyncScheduler.now;
});
它('应该随着计时器的变化显示每个状态',fakeAsync(()=>{
fixture.detectChanges();//触发器ngOnInit()
const pollTimeInSeconds=loginPollTime*1000;
let received:编号|未定义;
计时器(0,pollTimeInSeconds,asyncScheduler).subscribe((值:number)=>received=value);
控制台日志(已接收);
timerTick(0);
fixture.detectChanges();
expect(debugEl.nativeElement.innerText.trim()).toEqual('messageone');
console.log(已接收)
timerTick(pollTimeInSeconds);
fixture.detectChanges();
expect(debugEl.nativeElement.innerText.trim()).toEqual('messagetwo');
console.log(已接收)
timerTick(pollTimeInSeconds*2);
fixture.detectChanges();
expect(debugEl.nativeElement.innerText.trim()).toEqual(“消息三”);
console.log(已接收)
}));
茉莉花产量为:

Expected 'Message one' to equal 'Message two'.
Expected 'Message one' to equal 'Message three'.
> undefined
> 0
> 1
> 3
控制台输出为:

Expected 'Message one' to equal 'Message two'.
Expected 'Message one' to equal 'Message three'.
> undefined
> 0
> 1
> 3

“…在我的情况下无法实现。”为什么?我对RXJS不是很熟悉,所以当我尝试它时,代码似乎不起作用。无论我做什么,我都无法让它增加计时器。如果你认为它会与一些变化,我想看看他们是什么!看看这个,但通常你需要将
TestScheduler
的一个实例传递给
timer(x,y,testSchedulerInstance)
@martin查看我的更新帖子,我已经尝试了我认为应该在这里工作的东西。。。但我运气不好“…在我的情况下无法实现。”为什么?我对RXJS不是很熟悉,所以在我尝试时代码似乎不起作用。无论我做什么,我都无法让它增加计时器。如果你认为它会与一些变化,我想看看他们是什么!看看这个,但通常你需要将
TestScheduler
的一个实例传递给
timer(x,y,testSchedulerInstance)
@martin查看我的更新帖子,我已经尝试了我认为应该在这里工作的东西。。。但是我没有运气