首页 > 解决方案 > 错误:: fromEvent 未声明为可写或没有设置器

问题描述

旧代码使用 rxjs v5.5.12,我们将相同的代码复制到使用 rxjs v6.4.0 的新项目中。当我们尝试运行测试用例时,我们得到了这个错误。

旧代码:

import * as ObservableEvents from 'rxjs/Observable/fromEvent';
spyOn(ObservableEvents, 'fromEvent').and.returnValue(new Subject<any>().asObservable());

新代码:

import * as rxjs from 'rxjs';
spyOn(rxjs, 'fromEvent').and.returnValue(new Subject<any>().asObservable());

在这两种情况下,我们都会收到此错误:

错误: : fromEvent 未声明为可写或没有设置器

我们找不到解决此问题的有效资源。

更新#1

我们尝试使用

import * as rxjs from 'rxjs';
spyOn(jasmine.createSpyObj(rxjs), 'fromEvent').and.returnValue(new Subject<any>().asObservable());

但这一次,我们得到了

createSpyObj 需要一个非空数组或方法名称对象来创建用于抛出的间谍

更新#2:

我们使用了来自@Omair-Nabiel 的代码,现在出现了一个新错误

      TypeError: Object(...) is not a function
          at XxxPopoverDirective.fromEvent [as createPopover] (http://xxx:xxxx/src/app/shared/xxx/xxx.directive.ts?:113:37)
          at XxxPopoverDirective.createPopover [as mouseClick] (http://xxx:xxxx/src/app/shared/xxx/xxx.directive.ts?:70:14)
          at runTest (http://xxx:xxxx/src/app/shared/xxx/xxx.directive.spec.ts?:181:19)

xxx.directive.ts

line 113-> this.componentRef && this.componentRef.destroy();
this.componentRef = null;

line 70-> constructor(
...
private resolver: ComponentFactoryResolver,
...
  ) { }

更新#3

嗨 Omair Nabiel,请找到我们正在使用的以下代码,请告诉我解决方案,

file="popover.directive.ts" 代码:

import { fromEvent } from 'rxjs/Observable/fromEvent';

this.clickOutSub = fromEvent(this.documentRef.getDocument(), 'click').subscribe(this.clickOut.bind(this));

file="popover.directive.spec.ts"
Code:
import * as ObservableEvents from 'rxjs/Observable/fromEvent';

function runTest() {

spyOn(ObservableEvents, 'fromEvent').and.returnValue(new Subject<any>().asObservable());

 }

it('...', () => {
expect(ObservableEvents.fromEvent).toHaveBeenCalled();
});

标签: angularrxjskarma-jasminerxjs6

解决方案


您需要监视 rxjs 的属性。使用 spyOnProperty 将解决该错误。尝试这个

 import * as rxjs from 'rxjs'
 import { of, fromEvent } from 'rxjs';  

spyOnProperty(rxjs, 'fromEvent').and.returnValue(of({}))

你也可以像这样添加到 getter/setter

spyOnProperty(rxjs, 'fromEvent', 'get').and.returnValue(false)

希望这可以帮助


推荐阅读