js简单放羊式单元测试-上
这是看了很多js单元测试资料后第一次自己做单元测试,因为资料都在介绍工具怎么使用,js单元测试的工具是在是太多了,各种风格,各种支持的,新的旧的,so 还是自己动手来体验一次
简单 是我给自己的需求很简单,读取github api 做个简单的列表页面,点击一项跳到详情页面,倾向页面再次读取github api 填充数据
因为以前段时间在看百度GMU 所以就在百度这个基础上做了
其实也是尝试将自己做的东西从各种js框架 ui库中分离出来,
放羊式 是因为我写了 很松散的一些 function 并没有模块化和结构化,模块化和结构化的测试放在第二轮
首先 看一下GMU demo 里的一段代码 我是在demo基础上修改的 对gmu还不是很熟悉
$(function(){
var html = '<ul id="J_widgetList">';
for(var i in widgets){
html += '<li><a href="' + i +'"><img src="./assets/img/' + widgets[i]['icon'] + '" alt="' + widgets[i]['name'] + '">' +
'<span class="title">' + widgets[i]['name'] + '</span><span class="desc">' + widgets[i]['description'] + '</span></a></li>';
}
html += '</ul>';
$('#scroller1 ul').remove();
$('#scroller1').append(html);
// $('.pages').height($('#J_widgetList').height());
setTimeout(function(){
new iScroll('S_widgets');
$(window).trigger('resize');
}, 200);
});
读取 api接口 填充重列表页,然后setTimeout 创建iScroll,就可以完成列表页面了

最终效果和图例里面差不多,其实这就是最终效果。。。
这么简单的事情以前我是这么处理的
function yiqian(owner,repo){
$.ajax({
url: 'https://api.github.com/repos/'+owner+'/'+repo+'?callback=?',
// post payload:
success: function(data){
//1 拼接字符串或着用js模板引擎处理
//2 填充页面dom
//3 绑定list的事件
// cbfn(data)
}
})
}
但是现在要做单元测试,
1 我要测试 接口返回的内容是不是我想要的
原因:无数次上线表明本地、测试站、正式站存在配置错误而谁都不知道,尤其是新老接口等等,不测就是坑
2 我要测试纯js处理数据结果是不是我想要的
原因:无数次上线表明处理结果 a 处理结果b 处理结果c可能 要同时上线进行运营验证那个效果好,不测试就是坑
3我要测试绑定事件知否正常
原因:无数次上线表明:哎呀,昨天还可以点击的今天怎么没了,本地、测试都好好的呢。。。。。
我选择资料最简单 用户群最多的qunit 做单元测试工具
没有看过 qunitjs cookbook 的清看这里 http://qunitjs.com/cookbook/
有言在先:qunitjs 的同步回调和异步回调和我把同步异步回调搞在一起具体怎么弄我还不是很清楚 ,so我这次是按照异步回调处理的,如果错了请大家改正
异步回调怎么做单元测试 http://qunitjs.com/cookbook/#asynchronous-callbacks
asyncTest( "asynchronous test: one second later!", function() {
expect( 1 );
setTimeout(function() {
ok( true, "Passed and ready to resume!" );
start();
}, 1000);
});
1
哎 我发现了,需要吧测试代码写到异步回调回调的方法里面去,这样刚才那个ajajx就得改改了
function yiqian(owner,repo,cbfn){
$.ajax({
url: 'https://api.github.com/repos/'+owner+'/'+repo+'?callback=?',
// post payload:
success: function(data){
//1 拼接字符串或着用js模板引擎处理
//2 填充页面dom
//3 绑定list的事件
cbfn(data)
}
})
}
给最后加一个处理数据的回调方法
单元测试代码很简单
asyncTest( "asynchronous test: ajax data ready1 ", function() {
expect( 1 );
var $video = $( "video" );
getgithubrepositories(function(data){
var flag=false;
if(data.data.length>0)
{
flag=true;
}
ok( flag, "video has loaded and is ready to play2" );
start();
})
});
这是从官网抄袭过来的代码,加了我要测试的东西,注释都没改
这种简单的测试ajax数据的有意义吗?好像意义不大,但
1 我测试了这个接口能不能访问,存不存在,是不是配置正确
2 测试返回数据的版本 是不是我要的,还可以细致的测试数据结构是不是你要的
测试完了数据能不能拿到和数据版本对不对,该测试根据数据生成html片段,这个函数很显然,可以放在刚才的回调函数里面
参数 1 个 就是ajax返回的数据
function makedatatest (data){
var html = '<ul id="J_widgetList">';
var tempfun=$.parseTpl('<li data-owner="<%=owner.login%>" data-repo="<%=name%>" ><a><img src="<%=owner.avatar_url%>" ><span class="title"><%=name%></span><span class="desc"><%=description%></span></a> </li>');
if(data!=null&&data!=undefined&& data.data!=null&&data.data!=undefined){
for(var i=0;i<10;i++)
{
//html += '<li><a><img src="'+data.data[i].owner.avatar_url+'" ><span class="title">'+data.data[i].name+'</span><span class="desc">'+data.data[i].description+'</span></a> </li>';
html+=tempfun(data.data[i]);
}
html += '</ul>';
$('#scroller1 ul').remove();
$('#scroller1').append(html);
// $('.pages').height($('#J_widgetList').height());
}
}
可以看到 这是一个同步的js处理数据的函数,而且是没有回调方法,也是单元测试里面较为简单的,下面是标准的测试代码
test("hello", function() {
ok(true, "world");
})
跟着学一遍代码如下
asyncTest("git list dom test", function() {
expect( 2 );
var $fixture = $( "#qunit-fixture" );
//#scroller1
var mydom= $fixture.append('<div id="scroller1"></div>')
makedata(listdata);
var num= $fixture.find('#J_widgetList>li').length;
// var num= $('#scroller1>#J_widgetList>li').length;
var flag=false;
if(num>0)
{
flag=true
}
ok(flag, "git list dom2 ");
})
注意jq做单元测试,所有和dom相关的修改都要在qunit-fixture 节点下进行,所以就有个准备测试数据的过程,这里先简单这么弄弄
这里通过判断 dom修改后li的数据
1判断 是否执行了拼接
2 判断是否插入的数据到指定位置
3 具体的dom结构的判断 和dom结构版本的判断 这里没做。。。。。先做简单的
下次说说时间绑定和测试
js简单放羊式单元测试-上的更多相关文章
- js简单实现链式调用
链式调用实现原理:对象中的方法执行后返回对象自身即可以实现链式操作.说白了就是每一次调用方法返回的是同一个对象才可以链式调用. js简单实现链式调用demo Object.prototype.show ...
- mescroll.js简单的上拉加载、下拉刷新插件,带完整注释
声明:本插件模仿自mescroll.js,随手所作,仅以注释提供思路,只实现了部分效果,且没有考虑兼容,有兴趣的朋友随意一看.api大家可参考mescroll.js API汇总一文. demo:点我下 ...
- Glide.js:响应式 & 触摸友好的 jQuery 滑块插件
Glide.js 是一款响应式和对触摸友好的 jQuery 滑块.基于 CSS3 转换实现,并在低版本浏览器降级处理.Glide.js 简单,重量轻,快速,适用于智能手机,平板电脑和台式机.它支持 s ...
- 指尖下的js ——多触式web前端开发之一:对于Touch的处理
指尖下的js ——多触式web前端开发之一:对于Touch的处理 水果公司的那些small and cute的设备给我们提供了前所未有的用户体验.当用户在iphone和ipad上运指如飞的时候,那些使 ...
- baguetteBox.js - 简单易用的 lightbox 插件
baguetteBox.js 是一个简单和易于使用的响应式的图像 Lightbox 插件,支持滑动手势在移动设备上使用.纯 JavaScript 实现,不依赖第三方库和插件,赶紧来体验吧. 在线演示 ...
- js实现链式操作
前言:前不久阿里远程面试时问了我一个问题,如下: function Person(){}; var person = new Person(); //实现person.set(10).get()返回2 ...
- 使用JS简单实现一下apply、call和bind方法
使用JS简单实现一下apply.call和bind方法 1.方法介绍 apply.call和bind都是系统提供给我们的内置方法,每个函数都可以使用这三种方法,是因为apply.call和bind都实 ...
- Tourist.js – 简单灵活的操作指南和导航插件
Tourist.js 是一个基于 Backbone 和 jQuery 开发的轻量库,帮助你在应用程序创建简单易用的操作指南和导航功能.相比网站,它更适合用于复杂的,单页网站类型的应用程序.Touris ...
- Gulp.js - 简单、直观的自动化项目构建工具
Gulp.js 是一个简单.直观的构建系统.崇尚代码优于配置,使复杂的任务更好管理.通过结合 NodeJS 的数据流的能力,你能够快速构建.通过简单的 API 接口,只需几步就能搭建起自己的自动化项目 ...
随机推荐
- postgresql是如何处理死连接(转)
在数据库postgresql中,一个客户端到服务器连接实际上是一个tcp socket连接,tcp连接是虚连接,一方非正常退出(如断电),另一方会继续维持这个连接. 举个例子,一个客户端电脑正常连 ...
- linuxmint 17没有vim
首先上软件管理器中安装vim,之后配置.vimrc文件 下面是从网上摘抄的配置文件: """""""""&qu ...
- 如何使用C自带的qsort快速排序
/ you can write to stdout for debugging purposes, e.g. // printf("this is a debug message\n&quo ...
- JavaScript方法call、apply、caller、callee、bind的使用详解及区别
一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). 即 “某个方法”当做“指定的某个对象”的“方法”被执行. Js代 ...
- 妈妈再也不用担心别人问我是否真正用过redis了
1. Memcache与Redis的区别 1.1. 存储方式不同 1.2. 数据支持类型 1.3. 使用底层模型不同 2. Redis支持的数据类型 3. Redis的回收策略 4. Redis小命令 ...
- jquery解析php通过ajax传过来的json二维数组对象
ajax获得php传过来的json二维数组对象,jquery解析 php代码: <?php $news = array( '武汉'=>array(1,2,3), '广州'=>arra ...
- html5页面打包成App - Android或Iphone安装程序
下载安装前端开发工具:HBuilder 官网下载:http://www.dcloud.io/ 根据官网说明安装 * 打开登录HBuilder,把做好的H5页面通过添加app项目把H5的文件夹加入进来( ...
- 理解记忆三种常见字符编码:ASCII, Unicode,UTF-8
理解什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是25 ...
- 【ASP.NET】利用Nuget打包package——GUI方式
GUI方式 通过GUI的方式,可以下载如下的软件 NuGetPackageExplorer 打包dll 1.打开软件,在Package Content处点击右键 ,选择Add Lib 2.在lib ...
- 【转】Drawable /Bitmap、String/InputStream、Bitmap/byte[]
原文:http://wuxiaolong.me/2015/08/10/Drawable-to-Bitmap/ Drawable互转Bitmap Drawable转Bitmap 1234 Resourc ...