我有我需要取消一个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的可观测史诗这种竞争情况?