概述

前几天学习用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是否能模拟jsonp
test('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是否能模拟jsonp
test('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. 要注意找问题的方法,把过程详细的一条条写出来,然后思考在这些过程中哪里会出问题?

折腾nock给jsonp进行单元测试的更多相关文章

  1. React单元测试——十八般兵器齐上阵,环境构建篇

    一个完整.优秀的项目往往离不开单元测试的环节,就 github 上的主流前端项目而言,基本都有相应的单元测试模块. 就 React 的项目来说,一套完整的单元测试能在在后续迭代更新中回归错误时候给与警 ...

  2. 单元测试地二蛋 先弄个两个原生模块1个原始的一个jq插件

    放羊测试测完了再测这两个瞎搞的下拉列表组建 看看从单元测试模块化的角度组建会写成啥样 1:ajax请求 简单文本     2:1个页面多个实例     3:复杂展示+自定义点击+自定义处理函数     ...

  3. Android单元测试实践

    为什么要写单元测试 首先要介绍为什么蘑菇街支付金融这边会采用单元测试的实践.说起来比较巧,刚开始的时候,只是我一个人会写单元测试.后来老板们知道了,觉得这是件 很有价值的事情,于是就叫我负责我们组的单 ...

  4. Jsonp post 跨域方案

    近期在项目中遇到这样一问题,关于jsonp跨域问题,get传值是可以的,但post传值死活不行啊,于是网上看了一大堆关于这方面的资料,最终问题得以解决,今天抽空与大家分享下. 说明:http://ww ...

  5. jsonp使用规范

    这两天花了很多时间弄研究jsonp这个东西, 可是无论我怎么弄..TMD就是不进入success函数,并且一直进入error函数...让我着实DT啊. 可以看下我之间的提问(这就是我遇到的烦恼).. ...

  6. jsonp与cors跨域的一些理解(转)

    CORS其实出现时间不短了,它在维基百科上的定义是:跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源.而这种访问是被同源策略所禁止的. ...

  7. 单元测试React

    React单元测试——十八般兵器齐上阵,环境构建篇 一个完整.优秀的项目往往离不开单元测试的环节,就 github 上的主流前端项目而言,基本都有相应的单元测试模块. 就 React 的项目来说,一套 ...

  8. 教育单元测试mock框架优化之路(中)

    转载:https://sq.163yun.com/blog/article/169564470918451200 三.间接依赖的bean的mock替换 对于前面提供的@Mock,@Spy+@Injec ...

  9. angular5中使用jsonp请求页面

    说多了,都是眼泪,折腾了很久,各种百度,查到的例子,全都报错,可能是因为我的angular的版本太高,向下都不兼容? 我的angular版本为最新的5.2.11: 下面是正确的jsonp请求的方法 1 ...

随机推荐

  1. typescript如何判断实例是否实现了接口?

    ·不能用instanceof,因为运行时不存在Interface ·TS 中判断是否实现接口的核心原则是基于结构而不是基于名称的.即鸭子类型判断. ·实现: interface A{ discrimi ...

  2. Linux sleep 语句以及循环 测试负载

    sleep 命令 sleep 1    睡眠1秒sleep 1s    睡眠1秒sleep 1m   睡眠1分sleep 1h   睡眠1小时 总代码 #!/bin/bash for i in {1. ...

  3. Linux学习笔记:Jenkins的使用(二)

    一些插件的使用 Deploy to container Plugin jenkins安装完成之后,添加插件 Deploy to container Plugin ,这个插件可以将打好的war包部署到t ...

  4. 55行代码实现Java线程死锁

    死锁是Java多线程的重要概念之一,也经常出现在各大公司的笔试面试之中.那么如何创造出一个简单的死锁情况?请看代码: class Test implements Runnable { boolean ...

  5. linux修改用户id,组id

    一.修改用户uid usermod -u foo 二.修改用户gid groupmod -g 2005 foo usermod -g 2005 foo 三.检查 cat /etc/passwd su ...

  6. Codeforces 1120 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 传送门 A题 传送门 题意简述:给你一个mmm个数的数列,现在规定把一个数列的1,2,...,k1,2,...,k1,2,...,k分成第一组,把k+1, ...

  7. laravel 打印完整sql

    DB::connection()->enableQueryLog(); // 开启QueryLog \App\User::find(1); dump(DB::getQueryLog());

  8. 学以致用三十四-----python2.0加载图片

    想用做一个静态图片为背景的页面.结果遇到了一些阻碍.其主要原因还是路径没有找对.网上也参考了不少方法,也许是因为版本不同,处理的方法也不同,因此按照网上的处理方式,也没有得到解决. 为此困惑了一天.结 ...

  9. anemometer安装

    1.背景介绍:nginx:1.9.3 安装路径/data/nginxphp:5.5.27 安装路径 /data/phpmysql:5.7.18 安装路径/usr/local/mysql软件下载目录 / ...

  10. Maven搭建SSH框架

    工具:Eclipse(Maven管理工具)+Tomcat+Mysql. 1.新建一个Maven工程(maven-archetype-webapp). 打开File ——>new——>Mav ...