Angular jasmine:属性没有访问类型get



我知道已经有人问过类似的问题,但到目前为止,绝对没有什么能解决我的问题。也许我错过了什么。

我有这个服务,它有一个getter,我想模拟

export class UserService {
private activeUserSubject: BehaviorSubject<UserModel>;

constructor() {
this.activeUserSubject = new BehaviorSubject<UserModel>(UserHelper.getCurrentUser());
}

public get activeUserValue(): UserModel {
return this.activeUserSubject.value;
}
}

所有其他的答案建议使用SpyOnProperty,但它只是不适合我。在我的规范中,我试图创建和模拟它,但我得到了错误属性activeUserValue没有访问类型get。

describe('MyComponent', () => {
///other
let authenticationService: jasmine.SpyObj<UserService>;
beforeEach(async () => {
userService = jasmine.createSpyObj<UserService>(['activeUserValue']);
await TestBed.configureTestingModule({
imports: [
///
],
declarations: [
///
],
providers: [
{ provide: UserService, useValue: userService }
]
})
.compileComponents();
});
fit('should create', () => {
const spy = spyOnProperty(userService, 'activeUserValue', 'get').and.returnValue(of(getMockUser()));
fixture.detectChanges();
expect(spy).toBe(getMockUser());
});
}

我做错了什么?

请记住,当您执行spyOnProperty(userService,时,您说这个getter存在于您创建的spyObject上,而它并不存在。一旦模拟了UserService,它的实现(不管它是否使用getter)就不重要了,我们应该使用模拟。

我会这样做(在注释后面加上!!):

describe('MyComponent', () => {
///other
let authenticationService: jasmine.SpyObj<UserService>;
beforeEach(async () => {
userService = jasmine.createSpyObj<UserService>(['activeUserValue']);
// !! attach activeUserValue to the spyObject
userService.activeUserValue = of(getMockUser());
await TestBed.configureTestingModule({
imports: [
///
],
declarations: [
///
],
providers: [
{ provide: UserService, useValue: userService }
]
})
.compileComponents();
});
fit('should create', () => {
// !! remove this line
fixture.detectChanges();
expect(spy).toBe(getMockUser());
});
}

最新更新