繁体   English   中英

Karma:属性没有访问类型 get

[英]Karma: property does not have access type get

我的 Angular 应用程序中的 Karma 测试出错。 错误是当我运行测试时:

Failed: Property activePropertyChanged does not have access type get

我正在尝试模拟一个名为ModuleSpecService的服务。 在此服务中有以下 getter:

get activePropertyChanged(): Observable<SpecificationPropertyObject> {
    return this.activePropChangedSubject.asObservable();
}

在我的spec文件中,我像这样模拟它:

spyOnProperty(moduleSpecServiceMock, 'activePropertyChanged', 'get').and.returnValue(of());

// then, in configureTestingModule() I define/mock the service like this:
providers: [{ provide: ModuleSpecService, useValue: moduleSpecServiceMock }]

所以我的服务中显然有一个我想嘲笑的吸气剂。 如果我使用spyOnProperty()删除该行, spyOnProperty()引发以下错误:

TypeError: this.moduleSpecService.activePropertyChanged.subscribe is not a function

所以我绝对需要模拟。

知道会出什么问题吗?

由于这似乎是 jasmine 中的一个错误,我设法通过一种解决方法解决了这个问题:

取而代之的是:

spyOnProperty(moduleSpecServiceMock, 'activePropertyChanged', 'get').and.returnValue(of()); 

我定义了这样的属性:

(moduleSpecServiceMock as any).activePropertyChanged = of();

我不得不将它转换为any ,因为如果没有,它(正确地)告诉我activePropertyChange是一个read-only属性(因为它只有一个 getter)。

不是最好的解决方案,但至少它有效:)

您可以使用传播语法:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

const moduleSpecServiceMock = {
  ...jasmine.createSpyObj('moduleSpecServiceMock ', ['']),
  activePropertyChanged: of()
} as jasmine.SpyObj;

这允许您在不需要as any语法的情况下设置私有属性和 getter。

这样做的一大好处是,如果您重构 getter 名称,那么测试属性也会更新,使用as any语法,您将失去类型和重构能力。

我修复了这个错误,在service 中创建了一个get属性,所以:

.spec.ts文件:

spyOnProperty(moduleSpecServiceMock, 'activePropertyChanged', 'get').and.returnValue(of("Test"));

.service.ts文件:

get activePropertyChanged(): Observable<any> {
 return of({...element});
}

我找到了一个稍微不同的解决这个问题的方法:

Object.defineProperty(moduleSpecServiceMock, 'activePropertyChanged', { value: of() });
enter code here

这个解决方案甚至重写了私有值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM