我们最近从Angular 5更新到Angular 6,并使用它更新了RxJs 6.作为迁移的一部分,计时器使用率已从以下变化:
Observable.timer()
Run Code Online (Sandbox Code Playgroud)
至
timer()
Run Code Online (Sandbox Code Playgroud)
在我们的测试中有很多地方我们使用以下模式模拟计时器可观察量.
let timerObserver: Observer<any>;
beforeEach(() => {
spyOn(Observable, 'timer').and.returnValue(Observable.create(
((observer: Observer<any>) => {
timerObserver = observer;
})
));
});
it(`should not have any notifications by default`, () => {
timerObserver.next('');
...
});
Run Code Online (Sandbox Code Playgroud)
有人知道如何迁移这种模式吗?
编辑:我在这里创建了一个简化的问题说明:
https://stackblitz.com/edit/angular-v6-testing-template-nm7add
// Hello.Component
ngOnInit() {
const timer$ = timer(30);
timer$.subscribe(() => {
this.testMe = 'this has been changed';
});
}
// Hello.component.spec
it('should set testMe after a given timer', fakeAsync(() => {
tick(50);
expect(fixture.componentInstance.testMe).toBe('this has been changed');
})); …Run Code Online (Sandbox Code Playgroud) 我做了一个一次性订阅,debounceTime在我的组件上有一个管道onInit:
this.subscriptions.add(
this.updateJobs$
.pipe(
filter(jobs => !!jobs.length),
debounceTime(MyComponent.ListStabilizationTimeInMS),
first(),
)
.subscribe((jobs: Update[]) => {
// some code
})
);
Run Code Online (Sandbox Code Playgroud)
因此,我需要discardPeriodicTasks();在每次fakeAsync测试后将其作为最后一行包含在内,我觉得这很乏味。否则我会收到Error: 1 periodic timer(s) still in the queue.所有测试的错误。
我试图创建一个afterEach:
afterEach(()=> {
discardPeriodicTasks();
});
afterEach(fakeAsync(()=> {
discardPeriodicTasks();
}));
Run Code Online (Sandbox Code Playgroud)
但它不起作用,通过测试的唯一方法是手动附加discardPeriodicTasks();到所有测试用例。如果可以自动化就太好了。