相关疑难解决方法(0)

我如何模拟RxJs 6计时器?

我们最近从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)

jasmine angular rxjs6

9
推荐指数
1
解决办法
3084
查看次数

在 Angular 中开玩笑测试后如何自动调用discardPeriodicTasks?

我做了一个一次性订阅,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();到所有测试用例。如果可以自动化就太好了。

jestjs angular

8
推荐指数
0
解决办法
1347
查看次数

标签 统计

angular ×2

jasmine ×1

jestjs ×1

rxjs6 ×1