错误:<spyOn>: fromEvent 未声明为可写或没有设置器 [英] Error: <spyOn> : fromEvent is not declared writable or has no setter

查看:68
本文介绍了错误:<spyOn>: fromEvent 未声明为可写或没有设置器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

旧代码使用 rxjs v5.5.12,我们将相同的代码复制到使用 rxjs v6.4.0 的新项目中.我们在尝试运行测试用例时遇到此错误.

The old code uses rxjs v5.5.12, We copied the same code to our new project which uses rxjs v6.4.0. We are getting this error when we tried to run the test case.

旧代码:

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());

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

In both cases we are getting this error:

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

Error: : fromEvent is not declared writable or has no setter

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

We couldn't find a valid resource to solve this issue.

更新 #1

我们尝试使用

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

但这一次,我们得到了

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

createSpyObj requires a non-empty array or object of method names to create spies for thrown

更新 #2:

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

We used the code from @Omair-Nabiel, now getting a new error

      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

奥马尔·纳比尔,请找到我们正在使用的以下代码,请告诉我解决方案,

Hi Omair Nabiel, Please find the below code we are using, please let me know the solution,

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

file="popover.directive.ts" Code:

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();
});

推荐答案

你需要监视 rxjs 的一个属性.使用 spyOnProperty 将解决该错误.试试这个

You need to spy on a property of rxjs. Using spyOnProperty will solve the error. Try this

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

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

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

you can also add to getter/setters using this like

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

希望能帮到你

这篇关于错误:&lt;spyOn&gt;: fromEvent 未声明为可写或没有设置器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆