2016-10-25 10 views
1

Я пишу тестовые чехлы для угловых компонентов.Как издеваться над наблюдаемым потоком при тестировании угловых компонентов?

Я создал сервис, который использует наблюдаемый поток, как показано ниже:

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$()

есть ли способ сделать это?

Я застрял в этой проблеме в течение очень долгого времени.

любые входы?

благодаря

ответ

4

selectedUser$ это не метод, поэтому вы не можете следить за ней. Вместо этого, если вы хотите, вы можете просто присвоить это ваш наблюдаемым

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

Но если честно, если это ваш полный спектр услуг, я не понимаю, почему вы даже не нужно дразнить его. Это достаточно просто, когда использование реального сервиса, вероятно, не повредит. Если вы используете реальный сервис, вы можете просто selectUser всякий раз, когда хотите испустить что-то новое для тестируемого компонента.