Often in unit tests we are focussing on the logic involved in crafting a network request, & how we respond to the result. The external service is unlikely to be under our control, so we need a way to ‘mock’ the Ajax request in a way that allows us to focus on the logic. In this lesson we’ll see how we can pass in dependencies into epics to make testing things Ajax requests easier.

In a real world React app, for one epic, we might have some dependecies. For example, ajax call. To make it easy for testing, we can make those deps as injectable deps.

When creating root epic:

import { createEpicMiddleware, combineEpics } from 'redux-observable';
import { ajax } from 'rxjs/observable/dom/ajax';
import rootEpic from './somewhere';const epicMiddleware = createEpicMiddleware(rootEpic, {dependencies: { getJSON: ajax.getJSON }
});

Using it in Epic:

// Notice the third argument is our injected dependencies!
const fetchUserEpic = (action$, store, { getJSON }) =>action$.ofType('FETCH_USER').mergeMap(({ payload }) =>getJSON(`/api/users/${payload}`).map(response => ({type: 'FETCH_USER_FULFILLED',payload: response})));

---------------Test example ---------------------

index.js, root setup

import {createStore, applyMiddleware, compose} from 'redux';
import {Provider} from 'react-redux';
import reducer from './reducers';
import { ajax } from 'rxjs/observable/dom/ajax';import {createEpicMiddleware} from 'redux-observable';
import {rootEpic} from "./epics/index";const epicMiddleware = createEpicMiddleware(rootEpic, {dependencies: {ajax}
});const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;const store = createStore(reducer,composeEnhancers(applyMiddleware(epicMiddleware))
);

Epic function:

import {Observable} from 'rxjs';
import {combineEpics} from 'redux-observable';
import {CANCEL_SEARCH, receiveBeers, searchBeersError, searchBeersLoading, SEARCHED_BEERS} from "../actions/index";const beers  = `https://api.punkapi.com/v2/beers`;
const search = (term) => `${beers}?beer_name=${encodeURIComponent(term)}`;export function searchBeersEpic(action$, store, deps) {return action$.ofType(SEARCHED_BEERS).debounceTime(500, deps.scheduler).filter(action => action.payload !== '').switchMap(({payload}) => {// loading state in UIconst loading = Observable.of(searchBeersLoading(true));// external API callconst request = deps.ajax.getJSON(search(payload)).takeUntil(action$.ofType(CANCEL_SEARCH)).map(receiveBeers).catch(err => {return Observable.of(searchBeersError(err));});return Observable.concat(loading,request,);})
}export const rootEpic = combineEpics(searchBeersEpic);

Test code:

import {Observable} from 'rxjs';
import {ActionsObservable} from 'redux-observable';
import {searchBeersEpic} from "./index";
import {RECEIVED_BEERS, searchBeers, SEARCHED_BEERS_LOADING} from "../actions/index";it.only('should perform a search', function () {const action$ = ActionsObservable.of(searchBeers('shane'));const deps = {ajax: {getJSON: () => Observable.of([{name: 'shane'}])}};const output$ = searchBeersEpic(action$, null, deps);output$.toArray().subscribe(actions => {expect(actions.length).toBe(2);expect(actions[0].type).toBe(SEARCHED_BEERS_LOADING);expect(actions[1].type).toBe(RECEIVED_BEERS);});
});

Refs: Link

转载于:https://www.cnblogs.com/Answer1215/p/7683341.html

[Redux-Observable Unit Testing] Mocking an ajax request when testing epics相关推荐

  1. Ext.Ajax.request和formPanel.getForm().submit()两种提交方法的异同:

    Ext.Ajax.request和formPanel.getForm().submit()两种提交方法的异同: 1. 相同点: a) 都是使用异步提交的方式: b) 默认都是使用POST方式来提交数据 ...

  2. [转] form.getForm().submit的用法及Ext.Ajax.request的小小区别

    原文地址:http://blog.csdn.net/hongleidy5000/article/details/7329325 [javascript] view plain copy if (!fo ...

  3. prototype.js ajax.request,prototype.js的Ajax对象分享

    我想prototype. 代码如下: var url = 'http://yoursever/your/your'; var pars = 'id=xxx'; var myAjax = new Aja ...

  4. ajax request headers,ajax request VS normal request

    ajax请求(asynchronized)与普通请求(synchronized)的报文头(Header)不同:String reqType = request.getHeader("X-Re ...

  5. Ext Ajax:如何调用Ext.Ajax.request方法和使用Java Servlet进行处理

    來源:http://www.cnzzad.com/tut/52959.html 使用Ext.Ajax.request提交数据的代码如下(这段代码在一个Js文件中,为避免中文乱码,js文件必须是utf- ...

  6. springmvc sends and receives data by ajax request using json format

    [0]README 1) springmvc sends or receives data by ajax request using json format; [1] ajax function & ...

  7. prototype.js ajax.request,javascript – Prototype和Ajax.Request范围

    我在原型的Ajax.Request类中获取正确的范围时遇到了麻烦.我要做的是编写一个包含ajax请求的简单API: API = Class.create({ initialize:function(a ...

  8. Ext.Ajax.request

    代码 /**    * @author l    */   function grant(){        Ext.Ajax.request({     //ajax提交的时候.出现x-mask-l ...

  9. java+ext.ajax,[转载]Ext Ajax:怎么调用Ext.Ajax.request方法和使用Java Servlet进行处理

    当前位置:我的异常网» Ajax » [转载]Ext Ajax:怎么调用Ext.Ajax.request方法和使 [转载]Ext Ajax:怎么调用Ext.Ajax.request方法和使用Java ...

最新文章

  1. 清华旷视:RepVGG,更佳的速度-精度trade-off!
  2. NLP中的自监督表示学习,全是动图,很过瘾的
  3. 艾伟_转载:ASP.NET模板引擎技术
  4. Java书籍Top 10
  5. Pytorch:GAN生成对抗网络实现MNIST手写数字的生成
  6. [POJ2157]Maze(DFS)
  7. Android studio的监听器初学者要懂
  8. java爬虫出发onclick事件_java爬虫(五)利用selenium 模拟点击获取动态页面的内容...
  9. 「leetcode」452. 用最少数量的箭引爆气球【贪心算法】详细图解
  10. 桌面壁纸被计算机管理员禁用,Win7更改桌面壁纸时出现“此功能已被禁用”如何解决...
  11. 音频属性采样率、通道数、位数、比特率、帧等
  12. android串口调试源码,android串口调试助手源代码
  13. 卷积神经网络CNN——使用keras识别猫咪
  14. 北京中医药大学计算机应用基础作业1,北京中医药大学远程教育“计算机应用基础”第5次作业.doc...
  15. Java SSLSocket的使用
  16. day02 Nacos集群配置、Feign远程调用和统一网关Gateway
  17. 计算机一级C类试题及答案,计算机一级c类试题(2)
  18. 点到点的距离、点到直线的距离、点是否在直线上
  19. pyspark lit 常量
  20. Kudaa新的P2P技术诞生,开创互联网内容传输加速新纪元

热门文章

  1. 织梦html不能生成,内容预览及生成HTML
  2. 想做网络推广浅析网站优化中标题该如何设置?
  3. 中小企业网站建设不妨试试快速建站
  4. mysql sql with_mysql5.7 查询sql 出错: with sql_mode=only_full_group_by
  5. python每隔一段时间保存网页内容_利用Python轻松爬取网页题库答案!教孩子不怕尴尬了!...
  6. centos7arm进入图形化_CentOS 7 安装图形化界面
  7. vrp车辆路径问题 php,蚁群算法在车辆路径问题(VRP)中的应用.ppt
  8. mac brew 安装
  9. metasploit 一款开源的渗透测试框架
  10. 受限玻尔兹曼机——用在推荐系统里