【问题标题】:spyOn(Observable, 'fromEvent') throws error after upgrading to rxjs 6.5spyOn(Observable, 'fromEvent') 升级到 rxjs 6.5 后抛出错误
【发布时间】:2020-10-05 19:36:33
【问题描述】:
getInactiveTimerTabSynchronizer() {
    return fromEvent(window, 'storage').pipe(
      filter((x: StorageEvent) => {
        return x.key === this.inactivityTabSynchronizerStorageKey;
      }),
      debounceTime(350));
  }

以上代码有如下单元测试用例:

import { Observable, of as observableOf } from 'rxjs';


it(
    'getInactiveTimerTabSynchronizer() function should return an observable that looks for storage events ' +
      'and filters it to only "INACTIVE_TIMER_RESET" keyed events',
    fakeAsync(
      inject([AuthService], (service: AuthService) => {
        spyOn(Observable, 'fromEvent').and.returnValue(
          observableOf({ key: 'INACTIVE_TIMER_RESET' } as StorageEvent, { key: 'SOME_OTHER_KEY' } as StorageEvent)
        );

        let counter = 0;
        service.getInactiveTimerTabSynchronizer().subscribe(x => {
          counter++;
          expect(counter).toBe(1);
        });
        tick(350);
        tick(350);
      })
    )
  );

当我有 angular 6 和 rxjs 5.5 时它工作正常,但是在我升级到 angular 7 和 rxjs 6.5 后它会抛出错误:

Argument of type '"fromEvent"' is not assignable to parameter of type '"prototype" | "create" | "if" | "throw"'

对修复或解决方法有任何帮助吗?

【问题讨论】:

    标签: angular jasmine rxjs5 rxjs6 spyon


    【解决方案1】:

    现在必须是 spyOn(rxjs, 'fromEvent')

     import * as rxjs from 'rxjs'
     ...
     spyOn(rxjs, 'fromEvent').and.returnValue(
          observableOf({ key: 'INACTIVE_TIMER_RESET' } as StorageEvent, { key: 'SOME_OTHER_KEY' } as StorageEvent)
        );
    

    因为使用 fromEvent 的旧方法是

    Rx.Observable.fromEvent(input, 'keyup')
    

    【讨论】:

    • 得到错误Error: <spyOn> : fromEvent is not declared writable or has no setter Usage: spyOn(<object>, <methodName>)
    猜你喜欢
    • 1970-01-01
    • 2014-07-02
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多