我们最近从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) 有没有简单的方法来模拟delay()
RxJS的方法,例如在虚假的时间观察?
我有这种方法:
register(user) {
return this._checkLog(user).delay(500).flatMap( ... )
}
Run Code Online (Sandbox Code Playgroud)
当我删除delay()
方法时,我从_register()进行的测试全部成功。
我正在将 Observable 的所有事件收集到一个data
数组中:
const obs$ = Rx.Observable
.interval(500)
.take(4);
let data = [];
const start = performance.now();
obs$.subscribe(
value => {
data.push({
time: performance.now() - start,
data: value
});
},
() => {},
() => {
console.log(JSON.stringify(data, null, 2));
}
);
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/rxjs@5.2.0/bundles/Rx.js"></script>
Run Code Online (Sandbox Code Playgroud)
是否有可能“预见未来”并在不等待 2 秒的情况下获得相同的data
数组?
澄清一下,我试图找到一种方法,以某种方式obs$
用自定义计时器/调度程序以某种方式包装给定的 Observable(在上面的示例中),以便我可以立即获取事件。