这是看了很多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简单放羊式单元测试-上的更多相关文章

  1. js简单实现链式调用

    链式调用实现原理:对象中的方法执行后返回对象自身即可以实现链式操作.说白了就是每一次调用方法返回的是同一个对象才可以链式调用. js简单实现链式调用demo Object.prototype.show ...

  2. mescroll.js简单的上拉加载、下拉刷新插件,带完整注释

    声明:本插件模仿自mescroll.js,随手所作,仅以注释提供思路,只实现了部分效果,且没有考虑兼容,有兴趣的朋友随意一看.api大家可参考mescroll.js API汇总一文. demo:点我下 ...

  3. Glide.js:响应式 & 触摸友好的 jQuery 滑块插件

    Glide.js 是一款响应式和对触摸友好的 jQuery 滑块.基于 CSS3 转换实现,并在低版本浏览器降级处理.Glide.js 简单,重量轻,快速,适用于智能手机,平板电脑和台式机.它支持 s ...

  4. 指尖下的js ——多触式web前端开发之一:对于Touch的处理

    指尖下的js ——多触式web前端开发之一:对于Touch的处理 水果公司的那些small and cute的设备给我们提供了前所未有的用户体验.当用户在iphone和ipad上运指如飞的时候,那些使 ...

  5. baguetteBox.js - 简单易用的 lightbox 插件

    baguetteBox.js 是一个简单和易于使用的响应式的图像 Lightbox 插件,支持滑动手势在移动设备上使用.纯 JavaScript 实现,不依赖第三方库和插件,赶紧来体验吧. 在线演示  ...

  6. js实现链式操作

    前言:前不久阿里远程面试时问了我一个问题,如下: function Person(){}; var person = new Person(); //实现person.set(10).get()返回2 ...

  7. 使用JS简单实现一下apply、call和bind方法

    使用JS简单实现一下apply.call和bind方法 1.方法介绍 apply.call和bind都是系统提供给我们的内置方法,每个函数都可以使用这三种方法,是因为apply.call和bind都实 ...

  8. Tourist.js – 简单灵活的操作指南和导航插件

    Tourist.js 是一个基于 Backbone 和 jQuery 开发的轻量库,帮助你在应用程序创建简单易用的操作指南和导航功能.相比网站,它更适合用于复杂的,单页网站类型的应用程序.Touris ...

  9. Gulp.js - 简单、直观的自动化项目构建工具

    Gulp.js 是一个简单.直观的构建系统.崇尚代码优于配置,使复杂的任务更好管理.通过结合 NodeJS 的数据流的能力,你能够快速构建.通过简单的 API 接口,只需几步就能搭建起自己的自动化项目 ...

随机推荐

  1. Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数、ColModel API、事件及方法

    系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件 ...

  2. 高版本api在低版本中的兼容

    直接上例子,看如何避免crash. eg:根据给出路径,获取此路径所在分区的总空间大小. 文档说明:获取文件系统用量情况,在API level 9及其以上的系统,可直接调用File对象的相关方法,以下 ...

  3. SVN和Git下载地址

    SVN: TortoiseSVN:https://tortoisesvn.net/downloads.html (安装包和语言) Git: Git for Windows:https://git-fo ...

  4. 如何挂载阿里云Linux服务器的“数据盘”(新购买)

    详细操作参考: http://jingyan.baidu.com/article/90808022d2e9a3fd91c80fe9.html 用到的命令行汇总: 1.查看磁盘: fdisk -l 2. ...

  5. C#常用类库(100多个)

    http://download.csdn.net/download/dxf1213cs/8238153

  6. BZOJ 3261: 最大异或和

    Description 一个序列,支持两个操作. 1.在序列尾加入一个数. 2.询问 [l,r] 中与 x 异或值最大的数. \(n\leqslant 3*10^5\) Sol 可持久化 Trie 树 ...

  7. BZOJ 4576: [Usaco2016 Open]262144

    Description 一个序列,每次可以将两个相同的数合成一个数,价值+1,求最后最大价值 \(n \leqslant 262144\) Sol DP. 这道题是 BZOJ 4580: [Usaco ...

  8. OC编程之道-创建对象之生成器模式

    生成器模式也叫建造者模式,一般是用来构造复杂对象的一种模式.client(客户)-director(指导者)-builder(构造者)-product(产品). 生成器模式能帮助构建设计部件与表现的各 ...

  9. eclipse配置jdk的src.zip源代码步骤

    MyEclipse配置JDK的源代码的src.zip包很简单.只需要简单的几个步骤. 1.点 “window”-> “Preferences” -> “Java” -> “Insta ...

  10. 使用jquery实现单选框、多选框取消选中状态

    function radioReset(){ /*方式一*/ /* var radios = $("input[type='radio']"); for (i=0; i<ra ...