Угловой тестовый модуль Mock Replay Subject - PullRequest
1 голос
/ 21 марта 2019

У меня есть служба с темой воспроизведения.

export class UserService {
  public userChanged: ReplaySubject<User> = new ReplaySubject<User>();

...
public getUser(userId?): void {
    ...
    this.http.get(url, httpOptions).pipe(
      catchError(this.handleError('getUser', null, 'Couldn\'t get user', options))
    ).subscribe( (user: User) => {

       this.userChanged.next(user);

    });
  }

Мой компонент подписывается на userChanged.

this.userService.userChanged.subscribe((user) => {
  this.user = user;
});

Теперь я хочу высмеять свой UserService втест компонента:

1 опция Тестирование наблюдаемых в угловых )

import { of } from 'rxjs';
...
    const userServiceSpy = jasmine.createSpyObj('UserService', {'userChanged': of({_id: '1'}) });

или 2 варианта)

    const userServiceSpy = jasmine.createSpyObj('UserService', {'userChanged': () => of({_id: '1'}) });

или 3 варианта учебник угловых испытаний )

const userServiceSpy = jasmine.createSpyObj('UserService', ['userChanged']});
const userChangedSpy = userServiceSpy.userChanged.and.returnValue( of({_id: '1'})  );

+

TestBed.configureTestingModule({
  ...
  providers: [
    ...
    {provide: UserService, useValue: userServiceSpy}
  ],
  schemas: [NO_ERRORS_SCHEMA]
})

дай мне эту ошибку:

this.userService.userChanged.subscribe is not a function

Не должен of вернуть наблюдаемое вподписаться на?

Вопрос: Как поиздеваться?

1 Ответ

3 голосов
/ 21 марта 2019

createSpyObj используется для создания шпионов на методах.Вы можете использовать его для getUser метод UserService.

userChanged - это просто свойство класса.Для этого вам не нужен шпион.

Что вы можете сделать, это просто создать фиктивный объект, который возвращает субъект:

const userChanged = new Subject();

 providers: [
    ...
    {provide: UserService, useValue: { userChanged }}
  ],

{ userChanged } равно { userChanged: userChanged }

Затем в вашем блоке beforeEach вы создадите новый пользовательский экземпляр:

//...
beforeEach(() => {
   const myUser = new User(...)
   userChanged.next(myUser)
})

Я рекомендую сделать это в блоке beforeEach, чтобы избежать побочных эффектов.между различными спецификациями.

 providers: [
    ...
    {provide: UserService, useValue: { userChanged: of({id: 1}) }}
  ],

Другой способ сделать то же самое - просто создать наблюдаемое с использованием метода of так же, как вы делаете это в своем примере.


Если вы действительно хотите шпионить за методом subscribe, вы можете создать для него шпион:

spyOn(userChanged, 'subscribe')


Если вы хотите смешать spyObject со свойствами,Вы можете использовать спред оператора:

const spyObj = {
  ... jasmine.createSpyObj('MyObject', ['spyMethod']),
  myProperty: true,
};

spyObj.spyMethod();

expect(spyObj.spyMethod).toHaveBeenCalled();
expect(spyObj.myProperty).toBeTrue();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...