Как проверить выбор канала ngrx в Rxjs 6 - PullRequest
0 голосов
/ 15 ноября 2018

Раньше я мог протестировать нижеследующее хранилище. Выберите

this.store.select(fromRoot.someselector).pipe(map(r => this.store.dispatch(new Action())));

Это было в моем тесте

{provide: Store, useValue: jasmine.createSpyObj('store', ['select']);

store.select.and.returnValue(of({}));

Но теперь оно изменилось на трубы

this.store.pipe(select(fromRoot.someselector));

this.store.pipe(
        select(fromRoot.someselector), 
        filter(result => !!result), 
        map(r => { 
             if (result === ' hello') { 
               this.store.dispatch(new Action()); 
             } 
           }
        ));

Как это проверить, особенно если у вас есть карта после выбора, и внутри нее вы отправляете действие и хотите, чтобы было вызвано действие.

Ответы [ 2 ]

0 голосов
/ 12 августа 2019

spyOn (store, 'pipe'). And.callFake (selector => {return of (true);});
... Ожидаем (store.pipe) .toHaveBeenCalledTimes (1);// pass

0 голосов
/ 15 ноября 2018

Пропустите операторы и напрямую протестируйте результат потока:

store
  .pipe(select('selector'))
  .subscribe(val => expect(val).toBe(theMockedValSentToTheSpy))

Чтобы объяснить дальше:

  • создать макет вашего магазина
  • создать макет вашей ценности
  • вернуть это поддельное значение в вашем смоделированном магазине
  • ожидаем, что ваша компонентная переменная вернет имитированное значение

Это дает:

const mockedValue = { id: 1 };
const storeSubjectMock = new BehaviorSubject(mockedValue);
const mockedStore = {
  pipe: () => storeSubjectMock.asObservable(),
};

// { provide: Sotre, useValue: mockedStore }; in your testbed

it('should return an unaltered value', () => {
  component.variableReferencingStore
    .pipe(select('selector'))
    .subscribe(val => expect(val).toBe(mockedValue))
});

Теперь хорошо то, что вы можете протестировать все операторы таким образом. Скажем, ваша переменная компонента

storeValue$ = this.store.pipe(
  select('selector'),
  map(value => ({ ...value, name: 'customName' }))
)

Тогда ваши тесты просто изменятся на

it('should return an altered value with a name property set to customName', () => {
  component.variableReferencingStore
    .pipe(select('selector'))
    .subscribe(val => expect(val).toEqual({ ...mockedValue, name: 'customName'))
});
...