如何在测试 angular2 组件时模拟可观察流?
How to mock a observable stream while testing angular2 components?
我正在为 angular2 组件编写测试用例。
我创建了一个使用可观察流的服务,如下所示:
import {Injectable} from '@angular/core'
import {Subject} from 'rxjs/Subject';
import {User} from './user.model';
@Injectable()
export class UserService {
selectedUserInstance:User = new User();
// Observable selectedUser source
private selectedUserSource = new Subject<User>();
// Observable selectColumn stream
selectedUser$ = this.selectedUserSource.asObservable();
// service command
selectUser(user:User) {
this.selectedUserInstance=user;
this.selectedUserSource.next(user);
}
}
现在在我的组件中,我订阅了这个流:
getSelectedUser() {
this.subscriptionUser = this.userService.selectedUser$.subscribe(
selectedUser => {
this.selectedUser = selectedUser;
}
);
}
现在在我的 spec.ts 文件中,我想将此流模拟为:
spyOn(userService, 'selectedUser$')
.and.returnValue(Observable.of({
'name': 'bhushan',
'desc': 'student'
}));
但它一直给我以下错误:
Error: spyOn could not find an object to spy upon for selectColumn$()
有什么办法吗?
我在这个问题上纠结了很长时间。
有任何输入吗?
谢谢
selectedUser$
不是一种方法,因此您无法监视它。相反,如果你愿意,你可以将它分配给你的 observable
rapidColumnService.selectedUser$ = Observable.of({
'name': 'bhushan',
'desc': 'student'
})
但老实说,如果那是你的完整服务,我不明白你为什么还要嘲笑它。它很简单,使用真正的服务可能不会受到伤害。如果你使用真正的服务,那么你可以 selectUser
每当你想向被测组件发出新的东西时。
更新
您还可以做的另一件事是使用 Subject
而不是 Observable
。 Subject
也是一个 Observable
,但它允许您发出值,从而更容易模拟值以进行测试。
rapidColumnService.selectedUser$ = new BehaviorSubject<any>();
然后当你想发送一个值时
rapidColumnService.selectedUser$.next({
'name': 'bhushan',
'desc': 'student'
});
根据您设置组件和订阅的方式,您可能只想使用普通 Subject
而不是 `BehaviorSubject。有关详细信息,请参阅 。
我正在为 angular2 组件编写测试用例。
我创建了一个使用可观察流的服务,如下所示:
import {Injectable} from '@angular/core'
import {Subject} from 'rxjs/Subject';
import {User} from './user.model';
@Injectable()
export class UserService {
selectedUserInstance:User = new User();
// Observable selectedUser source
private selectedUserSource = new Subject<User>();
// Observable selectColumn stream
selectedUser$ = this.selectedUserSource.asObservable();
// service command
selectUser(user:User) {
this.selectedUserInstance=user;
this.selectedUserSource.next(user);
}
}
现在在我的组件中,我订阅了这个流:
getSelectedUser() {
this.subscriptionUser = this.userService.selectedUser$.subscribe(
selectedUser => {
this.selectedUser = selectedUser;
}
);
}
现在在我的 spec.ts 文件中,我想将此流模拟为:
spyOn(userService, 'selectedUser$')
.and.returnValue(Observable.of({
'name': 'bhushan',
'desc': 'student'
}));
但它一直给我以下错误:
Error: spyOn could not find an object to spy upon for selectColumn$()
有什么办法吗?
我在这个问题上纠结了很长时间。
有任何输入吗?
谢谢
selectedUser$
不是一种方法,因此您无法监视它。相反,如果你愿意,你可以将它分配给你的 observable
rapidColumnService.selectedUser$ = Observable.of({
'name': 'bhushan',
'desc': 'student'
})
但老实说,如果那是你的完整服务,我不明白你为什么还要嘲笑它。它很简单,使用真正的服务可能不会受到伤害。如果你使用真正的服务,那么你可以 selectUser
每当你想向被测组件发出新的东西时。
更新
您还可以做的另一件事是使用 Subject
而不是 Observable
。 Subject
也是一个 Observable
,但它允许您发出值,从而更容易模拟值以进行测试。
rapidColumnService.selectedUser$ = new BehaviorSubject<any>();
然后当你想发送一个值时
rapidColumnService.selectedUser$.next({
'name': 'bhushan',
'desc': 'student'
});
根据您设置组件和订阅的方式,您可能只想使用普通 Subject
而不是 `BehaviorSubject。有关详细信息,请参阅