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

时间:2016-10-25 12:52:01

标签: 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();

  // 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'
        }));

但它一直给我以下错误:

  

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

有没有办法做到这一点?

我现在很久没遇到这个问题了。

任何输入?

感谢

1 个答案:

答案 0 :(得分:7)

selectedUser$不是一种方法,所以你不能窥探它。相反,如果你想要,你可以给它分配一个你的可观察

rapidColumnService.selectedUser$ = Observable.of({
  'name': 'bhushan',
  'desc': 'student'
})

但老实说,如果那是你的完整服务,我不明白为什么你甚至需要嘲笑它。这很简单,使用真实服务可能不会受到伤害。如果您使用真实服务,那么只要您想要向被测组件发送新内容,就可以selectUser