Наблюдается ли мраморное тестирование, что меняется после вызова метода? - PullRequest
1 голос
/ 05 февраля 2020

В Angular 8 у меня есть служба с доступным только для чтения свойством Observable, порожденным из BehaviorSubject<string>, который содержит строку, описывающую состояние службы. Также в сервисе есть методы, которые изменяют состояние сервиса.

export class StateService {
  private _state = new BehaviorSubject<string>('before');

  readonly state$ = this._state.asObservable();

  constructor () { }

  begin() { this._state.next('during'); }

  finish() { this._state.next('after'); }

  reset() { this._state.next('before'); }
}

Я хочу написать мраморные тесты в моем наборе Jasmine, чтобы элегантно проверить значение этого наблюдаемого при его изменении.

let scheduler: TestScheduler;

beforeEach(() => {
  scheduler = new TestScheduler((actual, expected) => {
    expect(actual).toEqual(expected);
  });
});

it('should flow states correctly', () => {
  scheduler.run(({expectObservable, flush}) => {
    const svc = setupSvc(); //Call to a function in the suite that sets up the StateService

    svc.begin();
    svc.finish();
    svc.reset();

    flush();

    expectObservable(svc.state$).toBe('a-b-c-d', {
      a: 'before',
      b: 'during',
      c: 'after',
      d: 'before'
    });
  });
});

Я пробовал разные комбинации вызова begin, finish, reset и помощника планировщика flush, но ожидание всегда сообщает только одно начальное значение (a мрамор) и никаких других.

Чего мне не хватает, чтобы иметь возможность это осуществить? Или мраморы - неправильный способ go о проверке этого?

1 Ответ

1 голос
/ 06 февраля 2020

Подписка на холодную наблюдаемую, полученную через помощника по испытанию, похоже, работает:

it('should flow states correctly', () => {
  scheduler.run(({ expectObservable, cold }) => {
    const svc = new StateService();

    cold('--a-b-c', {
      a: 'begin',
      b: 'finish',
      c: 'reset'        
    }).subscribe(methodName => {
      svc[methodName]();
    })

    expectObservable(svc.state$).toBe('a-b-c-d', {
      a: 'before',
      b: 'during',
      c: 'after',
      d: 'before'
    });
  });
});

Stackblitz

...