如何测试Redux的观察到史诗的竞争条件(How to test race condition of

2019-10-30 12:07发布

我有我需要取消一个Ajax调用并做史诗别的东西的使用情况。 还有一个例子 ,其中适合我的需要完全Redux的观察的文档。 然而,当我尝试在我的史诗测试赛车条件下,“取消”似乎并没有工作。

示例代码是这样的:

import { ajax } from 'rxjs/ajax';

const fetchUserEpic = action$ => action$.pipe(
  ofType(FETCH_USER),
  mergeMap(action => race(
    ajax.getJSON(`/api/users/${action.payload}`).pipe(
      map(response => fetchUserFulfilled(response))
    ),
    action$.pipe(
      ofType(FETCH_USER_CANCELLED),
      map(() => incrementCounter()),
      take(1)
    )
  ))
);

我的史诗具有相同的结构与上述的例子中,这是这样的:

initViewsEpic = (action$, state$, { ajaxGet }) => action$
  .ofType(INIT_VIEWS)
  .pipe(
    mergeMap(() => race(
      ajaxGet('/api/views/...')
        .pipe(
          switchMap(response => of(
            initViewsFulFilled(response),
            taskCompleted(INIT_VIEWS),
          )),
          startWith(taskInProgress(INIT_VIEWS)),
          catchError(error => of(
             notification(),
             taskCompleted(INIT_VIEWS),
           )),
        ),
      action$.pipe(
        ofType(INIT_VIEWS_CANCEL),
        map(() => taskCompleted(INIT_VIEWS),
        take(1),
      ),
    )),
  );

而我的测试是这样的:

test('should ignore the ajax call response when INIT_VIEWS_CANCEL action is fired', (done) => {
    const action$ = ActionsObservable.of({ type: 'INIT_VIEWS' }, { type: 'INIT_VIEWS_CANCEL' });
    const ajaxGet = () => timer(3000);

   initViewsEpic(action$, state$, { ajaxGet })
      .pipe(toArray()).subscribe((actions) => {
        expect(actions).toEqual([
          {
            type: 'TASK_IN_PROGRESS',
            payload: { id: 'INIT_VIEWS' },
          },
          {
            type: 'TASK_COMPLETED',
            payload: { id: 'INIT_VIEWS' },
          },
        ]);
        done();
      });
  });

我想,既然INIT_VIEWS_CANCEL行动遵循INIT_VIEWS动作同步,应该“赢”的ajaxGet和不应该有任何initViewsFulFilled熄灭。 但这种测试的结果总是返回initViewsFulFilled作为我史诗的第二输出动作(我用开玩笑来测试史诗)。

有什么我做错了在我的测试? 如果是这样,我怎么可以测试一个正确redux的可观测史诗这种竞争情况?

Answer 1:

我会说我要去给一个建议,以测试Redux的观察到的史诗(这是我做了什么) -使用TestScheduler在rxjs/testing 。 所以,我们不必划伤头部处理其他测试框架ascyn东西

希望这可以帮助别人和我一样谁有同样的问题。



文章来源: How to test race condition of a redux observable epic