JavaScript高级程序设计,JavaScript单元测试ABC
分类:pc28.am

成立 var d=new Date(); 要注意的是在JavaScript中月份的值是从0到11。 设置日期和岁月值 设置日期和时间值有二种艺术: 1、只申明间隔一九六八年1月1日清晨12点的飞秒数 a、间接用间隔一九七〇年二月1日黎明先生12点的皮秒数 var d=new Date; b、parse方法: parse方法采用字符串为参数,把该字符串调换到日期值,重返的是纳秒数。 举例为2012年三月三日开立Date对象: var d=new Date(Date.parse; 假设传给parse方法的字符串无法调换到日期,该函数再次回到NaN c、UTC方法: UTC方法也回到日期的微秒表示,但参数为年、月、日、时、分、秒、微秒,年、月为必选,别的为可选。 举例为二零一一年4月14日创制Date对象: var d=new Date; 2、直接注解UTC方法接纳的参数 var d=new Date; 参数准绳跟UTC方法相似。 Date类方法 Date类方法如下(来自://www.jb51.net/w3school/js/jsref_obj_date.htm):

图片 1

前言
  当前,在软件开拓中单元测量试验越来越受到开采者的垂青,它能拉长软件的开支成效,并且能维系支出的材料。今后,单元测验往往多见于服务端的支付中,但随着Web编制程序领域的分工逐级明细,在前面一个Javascript开拓领域中,也足以展开连锁的单元测验,以保险前端开荒的品质。
  在劳动器端的单元测验中,都有美妙绝伦的测量检验框架,在JavaScript中现在也可以有风流浪漫对很奇妙的框架,但在本文中,大家将本身入手一步步来达成二个轻易的单元测量检验框架。
  JS单元测量检验有好些个地点,超多的是对章程效果检查,对浏览器包容性检查,本文重要谈第大器晚成种。

方法

JavaScript的Date对象

正文检查的JS代码是本身原先写的四个JS日期格式化的办法,原来的小说在此地(javascript日期格式化函数,跟C#中的使用办法相近),代码如下:

描述

Date对象

复制代码 代码如下:

FF

Date对象:用于安装和得到当前的时间。

Date.prototype.toString=function(format){
var time={};
time.Year=this.getFullYear();
time.TYear=("" time.Year).substr(2);
time.Month=this.getMonth() 1;
time.TMonth=time.Month<10?"0" time.Month:time.Month;
time.Day=this.getDate();
time.TDay=time.Day<10?"0" time.Day:time.Day;
time.Hour=this.getHours();
time.THour=time.Hour<10?"0" time.Hour:time.Hour;
time.hour=time.Hour<13?time.Hour:time.Hour-12;
time.Thour=time.hour<10?"0" time.hour:time.hour;
time.Minute=this.getMinutes();
time.TMinute=time.Minute<10?"0" time.Minute:time.Minute;
time.Second=this.getSeconds();
time.TSecond=time.Second<10?"0" time.Second:time.Second;
time.Millisecond=this.getMilliseconds();
var oNumber=time.Millisecond/1000;
if(format!=undefined && format.replace(/s/g,"").length>0){
format=format
.replace(/yyyy/ig,time.Year)
.replace(/yyy/ig,time.Year)
.replace(/yy/ig,time.TYear)
.replace(/y/ig,time.TYear)
.replace(/MM/g,time.TMonth)
.replace(/M/g,time.Month)
.replace(/dd/ig,time.TDay)
.replace(/d/ig,time.Day)
.replace(/HH/g,time.THour)
.replace(/H/g,time.Hour)
.replace(/hh/g,time.Thour)
.replace(/h/g,time.hour)
.replace(/mm/g,time.TMinute)
.replace(/m/g,time.Minute)
.replace(/ss/ig,time.TSecond)
.replace(/s/ig,time.Second)
.replace(/fff/ig,time.Millisecond)
.replace(/ff/ig,oNumber.toFixed(2)*100)
.replace(/f/ig,oNumber.toFixed(1)*10);
}
else{
format=time.Year "-" time.Month "-" time.Day " " time.Hour ":" time.Minute ":" time.Second;
}
return format;
}

IE

Date对象方法分为二种:

后生可畏种接收本地时间;
风姿洒脱种选拔世界时间UTC(即方法中有“UTC”),则表示世界时间;(以0度经线为准卡塔 尔(阿拉伯语:قطر‎。

获取系统的脚下岁月:

var time = new Date();
console.log(time);

得到具体时刻(get卡塔尔

有着的get方法都两全UTC获取,除了getYear()getTimes()以外

这段代码近期从未察觉相比严重的bug,本文为了测量试验,大家把 .replace(/MM/g,time.TMonth) 改为 .replace(/MM/g,time.Month),那几个荒谬是前一个月份紧跟于10时,未有用两位数表示月份。
  未来有这么一句话,好的宏图都以重构出来的,在本文中也如出黄金时代辙,大家从最简便的开首。
先是版:用最原始的alert
  作为第后生可畏版,大家很偷懒的直白用alert来检查,完整代码如下:

Date()重返当日的日期和岁月。13getDate()从 Date 对象回到半年首的某一天 从 Date 对象回来二十二日中的某一天 从 Date 对象回到月份 。13getFullYear()从 Date 对象以四个人数字重回年份。14getYear 方法替代。13getHours()再次回到 Date 对象的小时 。13getMinutes()重回 Date 对象的分钟 。13getSeconds()重返Date 对象的秒数 。13getMilliseconds()再次来到 Date 对象的皮秒重返 1969 年 一月 1 日到现在的皮秒数。13get提姆ezoneOffset()重返本地时间与Green威治标依时期的分钟差。13getUTCDate()遵照世界时从 Date 对象再次回到月初的一天 依照世界时从 Date 对象回来周中的一天 。14getUTCMonth()根据世界时从 Date 对象回到月份 。14getUTCFullYear()依据世界时从 Date 对象回来叁个人数的年份。14getUTCHours()依据世界时再次来到 Date 对象的时辰。14getUTCMinutes()依据世界时重临 Date 对象的分钟。14getUTCSeconds()依据世界时重返 Date 对象的分钟。14getUTCMilliseconds()根据世界时重临 Date 对象的微秒再次回到一九六八年七月1日子夜到钦点日期设置 Date 对象中月的某一天 设置 Date 对象中月份 。13setFullYear。14setYear 方法代替。13setHours()设置 Date 对象中的时辰 。13setMinutes()设置 Date 对象中的分钟。13setSeconds()设置 Date 对象中的分钟 。13setMilliseconds()设置 Date 对象中的皮秒 以微秒设置 Date 对象。13setUTCDate()依据世界时设置 Date 对象中月份的一天 。14setUTCMonth()依照世界时设置 Date 对象中的月份 。14setUTCFullYear()依据世界时设置 Date 对象中的年份依据世界时设置 Date 对象中的小时 。14setUTCMinutes()依照世界时设置 Date 对象中的秒钟。14setUTCSeconds()依照世界时设置 Date 对象中的分钟。14setUTC米尔iseconds()依据世界时设置 Date 对象中的微秒再次来到该目的的源代码。1-toString()把 Date 对象转变为字符串。14toTimeString()把 Date 对象的年月某个改造为字符串。14toDateString()把 Date 对象的日子部分改变为字符串。14toGMTString 方法代替。13toUTCString()依照世界时,把 Date 对象转变为字符串。14toLocaleString()依照本地时间格式,把 Date 对象调换为字符串。13toLocaleTimeString()事务所面时间格式,把 Date 对象的光阴部分改变为字符串。13toLocaleDateString()根据本地时间格式,把 Date 对象的日子部分改造为字符串。13UTC()依据世界时重临 一九九九 年 1 月 1 日 到钦定日期的纳秒数。13valueOf()重临 Date 对象的原始值。14分享一个日子格式化方法 在那个时候候享受叁个日子格式化方法,使用方法跟C#中DateTime的ToString方法相通: 复制代码 代码如下: Date.prototype.toString=function{ var time={}; time.Year=this.getFullYear(); time.TYear=.substr; time.Month=this.getMonth() 1; time.TMonth=time.Month<10?"0" time.Month:time.Month; time.Day=this.getDate(); time.TDay=time.Day<10?"0" time.Day:time.Day; time.Hour=this.getHours(); time.THour=time.Hour<10?"0" time.Hour:time.Hour; time.hour=time.Hour<13?time.Hour:time.Hour-12; time.Thour=time.hour<10?"0" time.hour:time.hour; time.Minute=this.getMinutes(); time.TMinute=time.Minute<10?"0" time.Minute:time.Minute; time.Second=this.getSeconds(); time.TSecond=time.Second<10?"0" time.Second:time.Second; time.Millisecond=this.get米尔iseconds(); var oNumber=time.Millisecond/1000; if(format!=undefined && format.replace{ format=format .replace .replace .replace .replace .replace .replace .replace .replace .replace .replace .replace .replace .replace .replace .replace .replace .replace(/fff/ig,time.Millisecond) .replace(/ff/ig,oNumber.toFixed .replace(/f/ig,oNumber.toFixed; } else{ format=time.Year "-" time.Month "-" time.Day " " time.Hour ":" time.Minute ":" time.Second; } return format; } var d=new Date(); console.log; //2011-12-29 11:29:43 console.log; //2011-12-29 11:29:43 console.log(d.toString; //2011-12-29 console.log(d.toString; //11:29:43 console.log(d.toString("yyyy-MM-dd HH:mm:ss")); //2011-12-29 11:29:43 console.log(d.toString("yyyy年MM月dd日 HH:mm:ss")); //2011年12月29日 11:29:43 console.log(d.toString("yyyy-MM-dd HH:mm:ss fff")); //2011-12-29 11:29:43 862

岁月的获得(UTC为世界时间卡塔 尔(阿拉伯语:قطر‎:

get[UTC]FullYear( )——获取年份;
get[UTC]Month( )——获取月份;
get[UTC]Date( )——获取日期;
get[UTC]Day( )——获取星期;
get[UTC]Hours( )——获取小时;
get[UTC]Minutes( )——获取分钟;
get[UTC]Seconds( )——获取秒数;
get[UTC]米尔iseconds( )——获取飞秒;
getTime( ):重返Date对象的里边阿秒,这些值未有“UTC”方法;
getTimezoneOffset():再次回到当前几天期的当地球表面示与UTC表示之间的岁月差的值;
getYear( ):重回Date对象的年份值,提出选用get[UTC]FullYear()。

安装具体时间(set卡塔尔

复制代码 代码如下:

时刻的装置(UTC为世界时间卡塔 尔(阿拉伯语:قطر‎:

set[UTC]FullYear( )——设置年度;
set[UTC]Month( )——设置月份;
set[UTC]Date( )——设置日期;
set[UTC]Hours( )——设置时辰;
set[UTC]Minutes( )——设置分钟;
set[UTC]Seconds( )——设置秒数;
set[UTC]米尔iseconds( )——设置微秒;
setTime( ):使用飞秒格式,设置多个Date对象的值;
setYear( ):设置年份值,建议选择set[UTC]FullYear()。

设置时间的三种办法

<!DOCTYPE html>
<html>
<head>
<title>Demo</title>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
Date.prototype.toString=function(format){
var time={};
time.Year=this.getFullYear();
time.TYear=("" time.Year).substr(2);
time.Month=this.getMonth() 1;
time.TMonth=time.Month<10?"0" time.Month:time.Month;
time.Day=this.getDate();
time.TDay=time.Day<10?"0" time.Day:time.Day;
time.Hour=this.getHours();
time.THour=time.Hour<10?"0" time.Hour:time.Hour;
time.hour=time.Hour<13?time.Hour:time.Hour-12;
time.Thour=time.hour<10?"0" time.hour:time.hour;
time.Minute=this.getMinutes();
time.TMinute=time.Minute<10?"0" time.Minute:time.Minute;
time.Second=this.getSeconds();
time.TSecond=time.Second<10?"0" time.Second:time.Second;
time.Millisecond=this.getMilliseconds();
var oNumber=time.Millisecond/1000;
if(format!=undefined && format.replace(/s/g,"").length>0){
format=format
.replace(/yyyy/ig,time.Year)
.replace(/yyy/ig,time.Year)
.replace(/yy/ig,time.TYear)
.replace(/y/ig,time.TYear)
.replace(/MM/g,time.Month)
.replace(/M/g,time.Month)
.replace(/dd/ig,time.TDay)
.replace(/d/ig,time.Day)
.replace(/HH/g,time.THour)
.replace(/H/g,time.Hour)
.replace(/hh/g,time.Thour)
.replace(/h/g,time.hour)
.replace(/mm/g,time.TMinute)
.replace(/m/g,time.Minute)
.replace(/ss/ig,time.TSecond)
.replace(/s/ig,time.Second)
.replace(/fff/ig,time.Millisecond)
.replace(/ff/ig,oNumber.toFixed(2)*100)
.replace(/f/ig,oNumber.toFixed(1)*10);
}
else{
format=time.Year "-" time.Month "-" time.Day " " time.Hour ":" time.Minute ":" time.Second;
}
return format;
}
var date=new Date(2012,3,9);
alert(date.toString("yyyy"));
alert(date.toString("MM"));
</script>
</body>
</html>

方法1:

var data = new Date(200000);
console.log(data);

运转后会弹出 二〇一二 和 4 ,观望结果我们领略 date.toString("MM")方法是有题指标。
  这种方式特别不便于,最大的主题材料是它只弹出了结果,并不曾交给正确或不当的新闻,除非对代码极度熟习,不然很难知晓弹出的结果是多亏误,上面,大家写三个预知(assert)方法来进行测验,明显给出是万幸误的音讯。
其次版:用assert实行反省
  断言是表述程序设计人士对此系统应该完成气象的意气风发种预期,举个例子有贰个艺术用于把多个数字加起来,对于3 2,大家预料那个办法重回的结果是5,要是真的重返5那么就由此,不然给出错误提醒。
  断言是单元测量试验的焦点,在各类单元测量试验的框架中都提供了断言功用,这里大家写二个回顾的断言(assert)方法:

方法2:

var data = new Date(2020, 0, 1, 8, 8, 8);
console.log(data);

复制代码 代码如下:

方法3:

var data = new Date("May 1, 2017");
console.log(data);

function assert(message,result){
if(!result){
throw new Error(message);
}
return true;
}

本条方法采取多个参数,第三个是不对后的提示音信,第二个是预知结果
  用断言测量检验代码如下:

复制代码 代码如下:

var date=new Date(2012,3,9);
try{
assert("yyyy should return full year",date.toString("yyyy")==="2012");
}catch(e){
alert("Test failed:" e.message);
}
try{
assert("MM should return full month",date.toString("MM")==="04");
}
catch(e){
alert("Test failed:" e.message);
}

  运营后会弹出如下窗口:

图片 2

其三版:实行批量测验

  在其次版中,assert方法能够交到明确的结果,但万风姿洒脱想举办生机勃勃多元的测量检验,各个测量检验都要开展丰硕捕获,照旧相当不足便利。别的,在相同的测验框架中都能够交到成功的个数,退步的个数,及退步的错误新闻。

  为了能够方便在拜会测量试验结果,这里大家把结果用有颜色的文字显示的页面上,所以这里要写叁个小的输出方法PrintMessage:

复制代码 代码如下:

function PrintMessage(text,color){
var div=document.createElement("div");
div.innerHTML=text;
div.style.color=color;
document.body.appendChild(div);
delete div;
}

  下边,大家就写叁个近乎jsTestDriver中的TestCase方法,来开展批量测量试验:

复制代码 代码如下:

function testCase(name,tests){
var successCount=0;
var testCount=0;
for(var test in tests){
testCount ;
try{
tests[test]();
PrintMessage(test " success","#080");
successCount ;
}
catch(e){
PrintMessage(test " failed:" e.message,"#800");
}
}
PrintMessage("Test result: " testCount " tests," successCount " success, " (testCount-successCount) " failures","#800");
}

  测验代码:

复制代码 代码如下:

var date=new Date(2012,3,9);
testCase("date toString test",{
yyyy:function(){
assert("yyyy should return 2012",date.toString("yyyy")==="2012");
},
MM:function(){
assert("MM should return 04",date.toString("MM")==="04");
},
dd:function(){
assert("dd should return 09",date.toString("dd")==="09");
}
});

  结果为:

图片 3

如此大家一眼就能够见到哪些出错了。但这么是或不是就到家了吧,大家能够看见最终极度测量检验中 var date=new Date(二〇一二,3,9)是身处testCase外面定义的,而且整个testCase的测量检验代码中国共产党用了date,这里因为种种艺术中未有对date的值进行改过,所以没出难点,假设有个别测验方法中对date的值纠正了吗,测量试验的结果正是不确切的,所以在无数测量检验框架中都提供了setUp和tearDown方法,用来对统风度翩翩提供和销毁测验数据,上面大家就在大家的testCase中增添setUp和tearDown方法。
第四版:统生机勃勃提供测验数据的批量测量检验

  首先大家增多setUp和tearDown方法:

复制代码 代码如下:

testCase("date toString",{
setUp:function(){
this.date=new Date(2012,3,9);
},
tearDown:function(){
delete this.date;
},
yyyy:function(){
assert("yyyy should return 2012",this.date.toString("yyyy")==="2012");
},
MM:function(){
assert("MM should return 04",this.date.toString("MM")==="04");
},
dd:function(){
assert("dd should return 09",this.date.toString("dd")==="09");
}
});

  由于setUp和tearDown方法不到场测量试验,所以我们要改良testCase代码:

复制代码 代码如下:

function testCase(name,tests){
var successCount=0;
var testCount=0;
var hasSetUp=typeof tests.setUp == "function";
var hasTearDown=typeof tests.tearDown == "function";
for(var test in tests){
if(test==="setUp"||test==="tearDown"){
continue;
}
testCount ;
try{
if(hasSetUp){
tests.setUp();
}
tests[test]();
PrintMessage(test " success","#080");

if(hasTearDown){
tests.tearDown();
}

successCount ;
}
catch(e){
PrintMessage(test " failed:" e.message,"#800");
}
}
PrintMessage("Test result: " testCount " tests," successCount " success, " (testCount-successCount) " failures","#800");
}

  运维后的结果跟第三版同样。
总计及参照他事他说加以侦查作品

  上边说了,好的宏图是延绵不断重构的结果,上面包车型大巴第四版是还是不是就周密了呢,远远未达成,这里只是一个示范。假如大家须要那地点的文化,笔者背后能够再写写各种测验框架的施用。

  本文只是JS单元测量检验入门级的身体力行,让初读书人对JS的单元测量试验有个起来概念,归于引玉之砖,款待各位高人拍砖补充。

  本文参照他事他说加以考查了《测量检验驱动的JavaScript开拓》(个人以为还不易,推荐下)意气风发书第生龙活虎章,书中的测量试验用例也是八个年华函数,可是写的相比较复杂,初读书人不太轻便看懂。
作者:Artwl

当前,在软件开采中单元测量检验越来越受到开采者的尊重,它能加强软件的支出功效,何况能维持支付的质量。今后,单元测量试验往往多见于服...

本文由pc28.am发布于pc28.am,转载请注明出处:JavaScript高级程序设计,JavaScript单元测试ABC

上一篇:本着特殊符号,的拍卖方法_javascript工夫_脚本之 下一篇:没有了
猜你喜欢
热门排行
精彩图文