这是看了很多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. html传参数

    var request = { QueryString: function (paramName) { var url = window.location.search; paramValue = & ...

  2. AngularJS常用插件与指令收集

    angularjs 组件列表 bindonce UI-Router Angular Tree angular-ngSanitize模块-$sanitize服务详解 使用 AngularJS 开发一个大 ...

  3. HTML5在canvas中绘制复杂形状附效果截图

    HTML5在canvas中绘制复杂形状附效果截图 一.绘制复杂形状或路径 在简单的矩形不能满足需求的情况下,绘图环境提供了如下方法来绘制复杂的形状或路径. beginPath() : 开始绘制一个新路 ...

  4. 如何解决mathpage.dll或MathType.dll文件找不到问题

    解决方法(具体图文教程): 步骤一 要确保路径被office信任.依次打开word->文件->选项->信任中心->信任中心设置->添加新位置,添加C:\Program F ...

  5. XML Schema and XMLspy notes

    Introduction An xml documents consists of elements, attributes and text. There are two structures in ...

  6. 解决Xftp经常断开连接的问题,Xftp中文乱码

    #文件 --> 选项 --> 勾选“发送保持活动状态消息” 间隔 60秒 #工具 -> 选项 延伸阅读: Xshell个性化设置,解决Xshell遇到中文显示乱码的问题

  7. PHP exec/system启动windows应用程序,执行.bat批处理,执行cmd命令

    exec 或者 system 都可以调用cmd 的命令 直接上代码: <?php /** 打开windows的计算器 */ exec('start C:WindowsSystem32calc.e ...

  8. html用户注册界面

    html用户注册界面   先上一张简约的界面的效果图 这里是style里面的内容 <style> input[type]{ border: 1px solid darkorange; ba ...

  9. alert 替代效果smoke.js

    在一些表单等需要弹窗提醒的时候,每个浏览器都有一个alert(),comfirm()函数能弹出信息,但是浏览器的自带的这种效果样式不统一,而且都固定在页面顶部: smoke.js轻量级的JS插件,他标 ...

  10. VIM下的跳转练习

    在vim下可以使用常用的箭头键 但是 还有其它键可以让你更快的达到目标 hjkl 这是代替箭头键功能的 H M L 跳到屏幕的顶上 中间 下方 w 跳到下一个单词的开始e 跳到单词的结束b 向后跳 g ...