如何在测试angular2组件时模拟可观察流?

如何在测试angular2组件时模拟可观察流?,angular,jasmine,angular2-testing,angular2-observables,Angular,Jasmine,Angular2 Testing,Angular2 Observables,我正在为angular2组件编写测试用例 我创建了一个使用可观察流的服务,如下所示: import {Injectable} from '@angular/core' import {Subject} from 'rxjs/Subject'; import {User} from './user.model'; @Injectable() export class UserService { selectedUserInstance:User = new User();

我正在为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);
  }
}
现在在我的spec.ts文件中,我想将此流模拟为:

getSelectedUser() {
    this.subscriptionUser = this.userService.selectedUser$.subscribe(
      selectedUser => {
        this.selectedUser = selectedUser;
      }
    );
}
spyOn(userService, 'selectedUser$')
        .and.returnValue(Observable.of({
            'name': 'bhushan',
            'desc': 'student'
        }));
但它总是给我以下错误:

错误:spyOn无法为selectColumn$()找到要监视的对象

有没有办法做到这一点

我在这个问题上陷入了很长一段时间

有什么意见吗


谢谢

selectedUser$
不是一种方法,因此您不能监视它。相反,如果你想的话,你可以把它分配给你的可观察对象

rapidColumnService.selectedUser$ = Observable.of({
  'name': 'bhushan',
  'desc': 'student'
})
但老实说,如果这是你的全部服务,我不明白你为什么还要嘲笑它。在使用真正的服务可能不会造成伤害的情况下,这非常简单。如果您使用的是真正的服务,那么只要
选择user
,您就可以随时向被测组件发送新的内容

更新 您还可以做的另一件事是使用
主题,而不是使用
可观察的
主题
也是一个
可观察的
,但它允许您发出值,从而更容易模拟值进行测试

rapidColumnService.selectedUser$ = new BehaviorSubject<any>();

根据组件的设置和订阅方式,您可能只想使用普通的
主题
,而不是`行为主题'。有关更多信息,请参阅。

你是上帝,节省了我的时间+1我的expect声明应该怎么说?
rapidColumnService.selectedUser$.next({
  'name': 'bhushan',
  'desc': 'student'
});