【问题标题】:Observable epics not running service call可观察的史诗没有运行服务调用
【发布时间】:2018-04-19 17:24:45
【问题描述】:

我尝试按照文档中的示例来测试史诗:

史诗

import { ofType } from 'redux-observable';
import { combineEpics } from 'redux-observable';
import 'rxjs/add/operator/takeUntil';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import { switchMap } from 'rxjs/add/operator/switchMap';
import { from } from 'rxjs/observable/from';
import { of } from 'rxjs/observable/of';
import { fromPromise } from 'rxjs/observable/fromPromise';

import { 
  getTopStories
} from '../../../utils/service-helper';

import { type, actions } from './action';

export const getHackernewsStoryEpic = (action$, store) => 
  action$.ofType(type.GET_HACKERNEWS_STORIES_REQUEST)
          .switchMap(
            action =>  { 
              return from(getTopStories())
                        .takeUntil(action$.ofType(type.GET_HACKERNEWS_STORIES_REQUEST_CANCEL))
                        .map(result => actions.getHackernewsStoriesRequestSuccess(result))
                        .catch((error) => actions.getHackernewsStoriesRequestFailure(error))
            }
        );

export default combineEpics(
  getHackernewsStoryEpic
);

Get getTopStories 是与hackernews API 对话的服务调用:

export const getTopStories = async () => await getRequest('/topstories.json');

我的测试是这样的:

describe('Hackernews stories epic', () => {
  describe('getHackernewsStoryEpic', () => {
    let store;

    beforeEach(() => {
      store = mockStore();
    });

    afterEach(() => {
      nock.cleanAll();
      epicMiddleware.replaceEpic(storiesEpic);
    });
    it('should return success on request success', async () => {
      store.dispatch({ type: type.GET_HACKERNEWS_STORIES_REQUEST });
      expect(store.getActions()).toEqual([
        { type: type.GET_HACKERNEWS_STORIES_REQUEST },
        { type: type.GET_HACKERNEWS_STORIES_SUCCESS }
      ]);
    });
  });
});

查看测试失败,因为一个动作被触发并且 getTopStories() 永远不会触发(nock 没有抱怨没有模拟)并且没有获得下一个动作。我想我错过了应该运行异步调用的东西?

【问题讨论】:

    标签: rxjs rxjs5 redux-observable


    【解决方案1】:
     it('should return success on request success',  async () => {
          const mock = require('../../../../data/hackernews/topstories.json');
    
          nock(__ROOT_API__)
            .defaultReplyHeaders({ 'access-control-allow-origin': '*' })
            .get('/topstories.json')
            .reply(200, mock);
    
            const action$ = ActionsObservable.of(
              {type: type.GET_HACKERNEWS_STORIES_REQUEST}
            );
            const expectedAction = [actions.getHackernewsStoriesRequestSuccess(mock)]
            await getHackernewsStoryEpic(action$)
              .toArray()
              .toPromise()
              .then(actualOutputActions => {
                 expect(actualOutputActions).toEqual(expectedAction)
            });
        });
    

    【讨论】:

      猜你喜欢
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      相关资源
      最近更新 更多