我试图测试这段代码:
`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)
并使其可测试会很棒!
感谢。
答案 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()
}));