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

Bhu*_*kar 4 jasmine angular2-testing angular2-observables angular

我正在为angular2组件编写测试用例.

我创建了一个使用observable流的服务,如下所示:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

现在在我的组件中,我订阅了这个流:

getSelectedUser() {
    this.subscriptionUser = this.userService.selectedUser$.subscribe(
      selectedUser => {
        this.selectedUser = selectedUser;
      }
    );
}
Run Code Online (Sandbox Code Playgroud)

现在在我的spec.ts文件中,我想将此流模拟为:

spyOn(userService, 'selectedUser$')
        .and.returnValue(Observable.of({
            'name': 'bhushan',
            'desc': 'student'
        }));
Run Code Online (Sandbox Code Playgroud)

但它一直给我以下错误:

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

有没有办法做到这一点?

我很长时间以来一直坚持这个问题.

任何输入?

谢谢

Pau*_*tha 8

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

rapidColumnService.selectedUser$ = Observable.of({
  'name': 'bhushan',
  'desc': 'student'
})
Run Code Online (Sandbox Code Playgroud)

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