折腾nock给jsonp进行单元测试
概述
前几天学习用Jest和nock.js对异步api进行单元测试。在项目中,我用到了jsonp,自然想到对jsonp进行单元测试。
过程很折腾,结果很有趣。
jsonp.js
首先axios或者fetch都不支持jsonp,就连nodejs内置的http也不支持jsonp,所以要去找一个能发jsonp的库,翻了一下github,觉得jsonp这个库甚好,就用它了。
npm i jsonp
浏览器端与node端
Jest和nock都不支持浏览器端,只能用node端进行单元测试。
写好代码用node index.js运行,发现node端报错,在jsonp里面找不到document对象。
好吧,这是node端,jsonp的原理是用script
标签跨域,没有html没有document怎么添加script
标签跨域呢?
只好建html然后在浏览器端进行script
标签跨域。
好吧,就用create-react-app,还自带jest。
reate-react-app jsonp-test
npm i nock
测试100%通过?
安装完之后就在app.test.js里面写测试代码:
import jsonp from 'jsonp';
import nock from 'nock';var jsonpData = () => {return jsonp(host + url, opts, (err, data) => {return data;})
}describe('test-jsonp', () => {// 测试nock是否能模拟jsonptest('should get successful status', () => {const host = '//dora.webcgi.163.com';const url = '/api/213_792_2018_09_14/active_check';const opts = {account: '316547491'};nock(host).get(url).reply(function(uri, requestBody, cb) {setTimeout(function() {cb(null, [201, 'THIS IS THE REPLY BODY'])});});function callback(err, data) {expect(data.status).toBe(201);done();}jsonp('//dora.webcgi.163.com/api/213_792_2018_09_14/active_check', opts, callback);})
});
然后运行测试,发现100%通过,一片绿字,哇,心里很高兴,nock竟然能测试jsonp,哈哈!!!
再玩玩,修改了一下参数:
expect(1+1).toBe(3);
测试还是100%通过?不可能吧,哪里出了问题。
google没有找到,Jest的资料很少,只能看文档了,文档应该有。把Jest异步api测试文档仔细看了一下,才发现需要在箭头函数的括号里面加入done标记:
import jsonp from 'jsonp';
import nock from 'nock';var jsonpData = () => {return jsonp(host + url, opts, (err, data) => {return data;})
}describe('test-jsonp', () => {// 测试nock是否能模拟jsonptest('should get successful status', done => {const host = '//dora.webcgi.163.com';const url = '/api/213_792_2018_09_14/active_check';const opts = {account: '316547491'};nock(host).get(url).reply(function(uri, requestBody, cb) {setTimeout(function() {cb(null, [201, 'THIS IS THE REPLY BODY'])});});function callback(err, data) {expect(data.status).toBe(201);done();}jsonp('//dora.webcgi.163.com/api/213_792_2018_09_14/active_check', opts, callback);})
});
测试超时?
然后再进行测试,发现,测试超时?为什么http请求发不出去呢?
用react进行本地调用api试了好几次,明明可以啊。
非常摸不着头脑,找不到问题所在,明明发出去了http请求,react里面也能够接收http响应,证明没有被拉黑名单,为什么测试就接收不到http响应呢?
想了半天快要放弃的时候才突然想到,script?是的,jsonp的原理是在html加一个script标签进行跨域,而在node端根本就没有html好吗?自然就接受不到http响应啊啊啊啊。
我学到了什么?
- 对jsonp的原理有了更深的理解。jsonp不能在node端进行单元测试。
- 就算单元测试100%通过了,也有可能实际上是错的。
- 要注意找问题的方法,把过程详细的一条条写出来,然后思考在这些过程中哪里会出问题?
转载于:https://www.cnblogs.com/yangzhou33/p/9944428.html
折腾nock给jsonp进行单元测试相关推荐
- dubbo 单元测试_技术分享——一路踩坑构建Dubbo源码
源码环境 随着目前对技术栈的求知欲,也开始入手Dubbo源码啦!!! 构建源码第一步: 必备开发环境:Java 1.5 以上的版本:Maven 2.2.1 或者以上的版本: 官网下载源代码 官网构建文 ...
- vs2017c语言单元测试,vs2017单元测试没反应,检测出错误,有关详细信息,请查看“测试输出”窗口...
vs2017单元测试,.NET Core新建项目有此项目, 单元测试代码,发现[Fact]无法识别,测试项目没有引用XUnit,好吧,Nuget此程序集 namespacexunitProject { ...
- 现代软件工程讲义 2 开发技术 - 单元测试 amp; 回归测试
[移山之道 第11章] 1单元测试 你的RP是由你的程序质量决定的. --阿超 这一章讲的是两人合作,既然程序是两个人写的,那就会出现一个人写的模块被另一个人写的模块调用的情况.很多误解.疏忽都发生在 ...
- stringutils 用哪个包 apache spring_spring整合mq、jsonp跨越、httpclient工具的使用
训练大纲(第087天) 大家如果想快速有效的学习,思想核心是"以建立知识体系为核心",具体方法是"守破离".确保老师课堂上做的操作,反复练习直到熟练. 第173 ...
- React 折腾记 - (1) React Router V4 和antd侧边栏的正确关联及动态title的实现
前言 一如既往,实战出真理. 有兴趣的可以瞧瞧,没兴趣的大佬请止步于此. 免得浪费您的时间 效果图 基于antd的sidebar组件封装 折腾记的技术栈选型 Mobx & mobx-react ...
- nock模拟服务响应_使用Node.js nock拦截HTTP请求
nock模拟服务响应 Unit testing external APIs is difficult no matter what language you do it in. Hell, work ...
- Jest enzyme 进行react单元测试
下面的文章会默认读者了解 React及其技术栈以及基本的前端单元测试,由于本文涉及到的技术较多,故不宜一一在文中介绍,谅解. 写在前面 在撰写单元测试用例之前,我们需要了解到撰写测试用例的原因.写测试 ...
- Node.js 单元测试:我要写测试 - Mocha - Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率
-------------------------------------- 单元测试Express/NodeJs 个人理解, 1,如果不是测试http请求的单元测试,用Mocha, Chai等基本够 ...
- 前端单元测试到底要怎么写?看这一篇就够了
本文因未标注原创,如需转载,请顶部标注来源本公众号. 简介 随着 Web 应用的复杂程度越来越高,很多公司越来越重视前端单元测试.我们看到的大多数教程都会讲单元测试的重要性.一些有代表性的测试框架 a ...
最新文章
- GDCM:读取gdcm::Curve的测试程序
- drill apache_使用Apache Drill深入研究当今的大数据
- python3发布时间_Python3优雅操作-时间处理与定时任务
- iOS SDK具体解释之UIDevice(系统版本号,设备型号...)
- hduoj Stars 二维树状数组
- hadoop 主要配置文件
- 来教你用什么泡脚好,泡脚的好处有那些?
- NSIS:在线下载并安装程序
- COMSOL6.0 版本新功能:求解大型瞬态声学问题
- 浅谈jQuery WeUI框架
- 解决NintendoSwitch安装SXPro后开机长期蓝屏问题
- 宠物卡牌大赛奖励发放结束公告
- 《动态壁纸 : 手机壁纸大全》EULA条款协议
- Python 调试Webservice接口
- 如何确定Z检验的值(查正态分布表时要注意中间的数字都是面积,最左边一列和最上面一行都是Z值)...
- 洛谷OJ U552 守墓人 线段树模板题
- 公交卡信息是在服务器还是卡片,北京“市政交通一卡通”卡号的相关说明
- php setcookie 参数1,使用setcookie函数一步搞定设置和删除cookie
- 恐怖庄园的秘密 The Secret of Grisly Manor攻略
- LA 3266 Tian Ji -- The Horse Racing