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 }]
所以我的服务中显然有一个 getter 我想模拟。如果我删除带有 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;
这允许您设置私有属性和 getters 而无需 as any
语法。
这样做的一大好处是,如果您重构 getter 名称,那么测试 属性 也会更新,使用 as any
语法,您将失去类型和重构能力.
我修复了那个错误,在 服务 中创建了一个 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
这个解决方案甚至重写了私有值
我的 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 }]
所以我的服务中显然有一个 getter 我想模拟。如果我删除带有 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;
这允许您设置私有属性和 getters 而无需 as any
语法。
这样做的一大好处是,如果您重构 getter 名称,那么测试 属性 也会更新,使用 as any
语法,您将失去类型和重构能力.
我修复了那个错误,在 服务 中创建了一个 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
这个解决方案甚至重写了私有值