16

我正在为 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$() 找到要监视的对象

有什么办法吗?

我在这个问题上停留了很长时间。

任何输入?

谢谢

4

1 回答 1

28

selectedUser$不是一种方法,所以你不能监视它。相反,如果你愿意,你可以把它分配给你的 observable

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

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

更新

您还可以做的另一件事是使用 a 代替Observable使用 a Subject。ASubject也是一个Observable,但它允许您发出值,从而更容易模拟值以进行测试。

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

然后当你想发送一个值

rapidColumnService.selectedUser$.next({
  'name': 'bhushan',
  'desc': 'student'
});

根据您设置组件和订阅的方式,您可能只想使用普通Subject而不是 `BehaviorSubject。有关更多信息,请参阅此帖子

于 2016-10-25T13:11:54.267 回答