Шутка: издеваться над трубочкой - PullRequest
0 голосов
/ 27 сентября 2018

Как смоделировать более сложное поведение RxJs (в контексте NgRx)?

Учитывая простой компонент (SomeComponent):

export class SomeComponent implements OnInit {
  foo$: Observable<any>;
  bar$: Observable<any>;

  constructor(private store: Store<State>) {}

  ngOnInit() {
    this.foo$ = this.store.pipe(select(getFooSelector));
    this.bar$ = this.store.pipe(select(getBarSelector));
  }
}

Я хотел бы смоделировать хранилище таким образомthat:

  • На основе переданного селектора фиктивное хранилище возвращает другое значение.
  • Шпион, какой аргумент (селектор) был передан оператору select.

Основываясь на переданном селекторе, фиктивное хранилище возвращает другое значение

Я бы видел это примерно так:

store.pipe = jest.fn(selectOperator => {
  switch (selectOperator.arguments[0]) {
    case getFooSelector:
      return foo;
    case getBarSelector:
      return bar;
  }
}

Шпион, какой аргумент (селектор) был передан select operator.

Что-то в этом роде:

const spy = jest.spyOn(store, 'pipe');
expect(spy.mock.calls[0]).toHaveBeenCalledWith(select(getFooSelector));
expect(spy.mock.calls[1]).toHaveBeenCalledWith(select(getBarSelector));

Резюме

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

1 Ответ

0 голосов
/ 30 сентября 2018

Используйте RxJs Marbles для тестирования RxJ с NgRx.

Для получения дополнительной информации прочитайте RxJS Marble Testing: RTFM и посмотрите Jest Testing - Джесси Сандерс , Стратегии реактивного тестирования с NgRx - Брэндон Робертс и Майк Райан

Для реализации используйте jest.fn (). MockImplementationOnce

store.pipe = jest.fn()
   .mockImplementationOnce(foo)
   .mockImplementationOnce(bar)

expect(store.pipe).toHaveBeenCalledWith(select(getFooSelector));
expect(store.pipe).toHaveBeenCalledWith(select(getBarSelector));
...