如何测试Observable.timer

时间:2018-01-17 16:40:13

标签: angular unit-testing timer jasmine angular5

我试图测试这段代码:

`discardChanges() {
    const timer = Observable.timer(1000);
    this.showSpinner = true;
    timer.subscribe(() => {
        this.showSpinner = false;
        this.toastr.success('Changes discarded');
        this.loadCondition(this.condition);
        this.studyConditionsForm.markAsPristine();
    });
}`

使用Jasmine这样做:

`xit('should discard changes and navigate to conditions', fakeAsync(() => {
    expect(component.showSpinner).toBeFalsy();
    enter code herecomponent.discardChanges();
    expect(component.showSpinner).toBeTruthy();
    tick(1000);
    fixture.detectChanges();
    expect(component.showSpinner).toBeFalsy();
    discardPeriodicTasks();
  })
);`

但在运行ng test时出现此错误:

Error: 1 timer(s) still in the queue.​​

我阅读过很多帖子而且我没有让它发挥作用,实际上我也有同样的问题与另一个测试这样做,但在多次尝试之前神奇地工作(我不喜欢魔术说实话)。

我希望有人可以指导我,实际上如果有另一种最佳方式而不是使用const timer = Observable.timer(1000)并使其可测试会很棒!

感谢。

1 个答案:

答案 0 :(得分:1)

我正在使用rxjs 6.x,复制您的代码并运行ng test命令,然后测试通过。 您可以尝试将rxjs更新到较新的版本并再次测试(注意:rxjs 6.x中没有Observable.timer) 这是代码:

import { timer } from 'rxjs';
 discardChanges() { // method of component class
    const source = timer(1000);
    this.showSpinner = true;
    source.subscribe(() => {
        console.log(1)
        this.showSpinner = false;
    });
  }

测试规范代码:

 it('should test discardChanges', fakeAsync(() => {
        expect(component.showSpinner).toBeFalsy();
        component.discardChanges()
        expect(component.showSpinner).toBeTruthy();
        tick(1000);
        expect(component.showSpinner).toBeFalsy();
        discardPeriodicTasks()
      }));