2016-10-14 97 views
0

我正在创建一个应用程序,其中我使用REDX和节点获取远程数据获取。反应和笑话模拟模块

我想测试一个事实,即我很好地调用具有良好参数的获取函数。

这样,我使用jest.mock和jasmine.createSpy方法:

it('should have called the fetch method with URL constant',() => { 
      const spy = jasmine.createSpy('nodeFetch'); 
      spy.and.callFake(() => new Promise(resolve => resolve('null'))); 
      const mock = jest.mock('node-fetch', spy); 
      const slug = 'slug'; 
      actionHandler[FETCH_REMOTE](slug); 
      expect(spy).toHaveBeenCalledWith(Constants.URL + slug); 
     }); 

下面是我米试图测试功能:

[FETCH_REMOTE]: slug => { 
     return async dispatch => { 
      dispatch(loading()); 
      console.log(fetch()); // Displays the default fetch promise result 
      await fetch(Constants.URL + slug); 
      addLocal(); 
     }; 
    } 

,你可以看到,我试图记录console.log(fetch())行为,并且我有默认的承诺来解决node-fetch的问题,而不是我用Jest模拟的并且用jasmine窥探的。

你知道它不起作用吗?

编辑:我的测试显示我像我的间谍错误从来没有被称为

回答

1

你的动作处理实际上是一个动作处理厂。在actionHandler[FETCH_REMOTE]中,您正在创建一个新功能。返回的函数将dispatch作为参数并调用您所显示的代码。
这意味着您的测试代码将永远不会调用间谍的任何函数,因为从不调用创建的函数。

我想你需要创建一个模拟dispatch功能,做这样的事情:

let dispatchMock = jest.fn(); // create a mock function 
actionHandler[FETCH_REMOTE](slug)(dispatchMock); 

编辑:

对我来说,你的actionHandler看起来更像一个actionCreator,因为它是通常用redux来称呼,尽管我个人更喜欢称它们为actionFactories,因为这就是它们:创建动作的工厂。
正如您使用thunks(?)您的actionCreater(其误导性地命名为actionHandler)不会直接创建action,而是会在调度操作后立即调用另一个函数。为了便于比较,一个普通actionCreator看起来是这样的:

updateFilter: (filter) => ({type: actionNames.UPDATE_FILTER, payload: {filter: filter}}), 

在另一方面,一个actionHandler反应行动分派,并评估它们的负载。

这里是什么,我会在你的情况做:

创建一个名为actionFactories喜欢这个新对象:

const actionFactories = { 

    fetchRemote(slug): (slug) => { 
     return async dispatch => { 
      dispatch(loading()); 
      console.log(fetch()); // Displays the default fetch promise result 
      let response = await fetch(Constants.URL + slug); 

      var responseAction; 
      if (/* determine success of response */) { 
       responseAction = actionFactories.fetchSuccessful(response); 
      } else { 
       responseAction = actionFactories.fetchFailed(); 
      } 

      dispatch(responseAction); 
     }; 
    } 

    fetchFailed():() => ({type: FETCH_FAILED, }), 
    fetchSuccessful(response):() => ({type: FETCH_FAILED, payload: response }) 
}; 

创建FETCH_FAILEDFETCH_SUCCESSFUL一个的ActionHandler更新基于响应商店。

顺便说一句:您的console.log声明并没有多大意义,因为fetch只是返回一个承诺。