概述

前几天学习用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响应啊啊啊啊。

我学到了什么?

  1. 对jsonp的原理有了更深的理解。jsonp不能在node端进行单元测试。
  2. 就算单元测试100%通过了,也有可能实际上是错的。
  3. 要注意找问题的方法,把过程详细的一条条写出来,然后思考在这些过程中哪里会出问题?

转载于:https://www.cnblogs.com/yangzhou33/p/9944428.html

折腾nock给jsonp进行单元测试相关推荐

  1. dubbo 单元测试_技术分享——一路踩坑构建Dubbo源码

    源码环境 随着目前对技术栈的求知欲,也开始入手Dubbo源码啦!!! 构建源码第一步: 必备开发环境:Java 1.5 以上的版本:Maven 2.2.1 或者以上的版本: 官网下载源代码 官网构建文 ...

  2. vs2017c语言单元测试,vs2017单元测试没反应,检测出错误,有关详细信息,请查看“测试输出”窗口...

    vs2017单元测试,.NET Core新建项目有此项目, 单元测试代码,发现[Fact]无法识别,测试项目没有引用XUnit,好吧,Nuget此程序集 namespacexunitProject { ...

  3. 现代软件工程讲义 2 开发技术 - 单元测试 amp; 回归测试

    [移山之道 第11章] 1单元测试 你的RP是由你的程序质量决定的. --阿超 这一章讲的是两人合作,既然程序是两个人写的,那就会出现一个人写的模块被另一个人写的模块调用的情况.很多误解.疏忽都发生在 ...

  4. stringutils 用哪个包 apache spring_spring整合mq、jsonp跨越、httpclient工具的使用

    训练大纲(第087天) 大家如果想快速有效的学习,思想核心是"以建立知识体系为核心",具体方法是"守破离".确保老师课堂上做的操作,反复练习直到熟练. 第173 ...

  5. React 折腾记 - (1) React Router V4 和antd侧边栏的正确关联及动态title的实现

    前言 一如既往,实战出真理. 有兴趣的可以瞧瞧,没兴趣的大佬请止步于此. 免得浪费您的时间 效果图 基于antd的sidebar组件封装 折腾记的技术栈选型 Mobx & mobx-react ...

  6. nock模拟服务响应_使用Node.js nock拦截HTTP请求

    nock模拟服务响应 Unit testing external APIs is difficult no matter what language you do it in.  Hell, work ...

  7. Jest enzyme 进行react单元测试

    下面的文章会默认读者了解 React及其技术栈以及基本的前端单元测试,由于本文涉及到的技术较多,故不宜一一在文中介绍,谅解. 写在前面 在撰写单元测试用例之前,我们需要了解到撰写测试用例的原因.写测试 ...

  8. Node.js 单元测试:我要写测试 - Mocha - Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率

    -------------------------------------- 单元测试Express/NodeJs 个人理解, 1,如果不是测试http请求的单元测试,用Mocha, Chai等基本够 ...

  9. 前端单元测试到底要怎么写?看这一篇就够了

    本文因未标注原创,如需转载,请顶部标注来源本公众号. 简介 随着 Web 应用的复杂程度越来越高,很多公司越来越重视前端单元测试.我们看到的大多数教程都会讲单元测试的重要性.一些有代表性的测试框架 a ...

最新文章

  1. GDCM:读取gdcm::Curve的测试程序
  2. drill apache_使用Apache Drill深入研究当今的大数据
  3. python3发布时间_Python3优雅操作-时间处理与定时任务
  4. iOS SDK具体解释之UIDevice(系统版本号,设备型号...)
  5. hduoj Stars 二维树状数组
  6. hadoop 主要配置文件
  7. 来教你用什么泡脚好,泡脚的好处有那些?
  8. NSIS:在线下载并安装程序
  9. COMSOL6.0 版本新功能:求解大型瞬态声学问题
  10. 浅谈jQuery WeUI框架
  11. 解决NintendoSwitch安装SXPro后开机长期蓝屏问题
  12. 宠物卡牌大赛奖励发放结束公告
  13. 《动态壁纸 : 手机壁纸大全》EULA条款协议
  14. Python 调试Webservice接口
  15. 如何确定Z检验的值(查正态分布表时要注意中间的数字都是面积,最左边一列和最上面一行都是Z值)...
  16. 洛谷OJ U552 守墓人 线段树模板题
  17. 公交卡信息是在服务器还是卡片,北京“市政交通一卡通”卡号的相关说明
  18. php setcookie 参数1,使用setcookie函数一步搞定设置和删除cookie
  19. 恐怖庄园的秘密 The Secret of Grisly Manor攻略
  20. LA 3266 Tian Ji -- The Horse Racing

热门文章

  1. 伴性遗传-基因型频率和基因频率
  2. 华为中兴为何对未来信心十足?
  3. Jupyter Notebook使用的快捷键
  4. 面试官:来写个代码求一下两个数的最大公约数吧
  5. 实验2:结构建型模式应用实验(1)
  6. PopupMenu弹出位置的控制
  7. ios 关于开源框架GPUImage的简单说明
  8. Python(十三)IO编程
  9. 语音芯片播报方案选型补充说明
  10. 数据仓库-hive分区表