您的位置:首页 > Web前端 > JavaScript

QWrap的js单元测试工具

2011-03-07 16:16 225 查看
QWrap的js/_tools下面,有几个工具,还是挺实用的。
今天介绍一下单元测试工具。
QWrap的单元测试(unittest)工具,是基于jsspec(http://jania.pe.kr/aw/moin.cgi/JSSpec)的语法来的。其css也是完全照搬jsspec。
相对于jsspec,改变有:代码重构、弃用多次运行(仅对未通过的试例)策略、移去对原型的渲染、部分功能增删。

如何使用qwrap的jsspec:
<link rel="stylesheet" type="text/css" href="http://dev.qwrap.com/resource/js/_tools/unittest/JSSpec.css" />
<script type="text/javascript" src="http://dev.qwrap.com/resource/js/_tools/unittest/UnitTest.js"></script>
<script type="text/javascript" src="...自己的代码文件"></script>
<script>/*单元测试代码*/</script>
例如:
View Code

mix(Subject.prototype,{
_should: function(property,value,op,selfPre,selfTail,valuePre,valueTail,isReverse){
var selfDesc=[
selfPre,
property==null?"self":"self[property]",
selfTail
],
valueDesc=[
valuePre,
"value",
valueTail
];
var desc=[].concat( isReverse?valueDesc:selfDesc, op, isReverse?selfDesc:valueDesc );
var sFun=desc.join(" ");
//alert([sFun,this.self,property,value]);
var tempCur={
self:this.self,
property:property,
value:value,
sFun:sFun
};
try{
var fun=new Function("self","property","value","return ("+sFun+");");
}
catch(ex){//错误的调用了_should方法,造成matcher不合法
currentCaseStatus|=2;
currentErrorMsg="Matcher is illegle: "+ex.message;
currentShouldInfo=tempCur;
return;
}
try{
var result=fun(this.self,property,value);
}
catch(ex){//运行matcher时抛错
currentCaseStatus|=4;
currentErrorMsg="Not match: "+ex.message;
currentShouldInfo=tempCur;
return;
}
if(result !== true) {//Not Match
currentCaseStatus|=4;
currentErrorMsg="Not match";
currentShouldInfo=tempCur;
return;
}
currentCaseStatus|=1;//Match
return result;
},
should: function (op,value){
return this._should(null,value,op);
},
should_be: function (value){
return this._should(null,value,"===");
},
should_not_be: function (value){
return this._should(null,value,"!==");
},
should_have_method: function(methodName){
return this._should(methodName,"function","==","typeof");
},
should_have_property: function(property){
return this._should(null,property,"in",null,null,null,null,true);
},
should_contains: function(value){
return this._should(null,value,".contains",null,null,"(",")");
},
property_should:function (property,op,value){
return this._should(property,value,op);
},
property_should_be:function (property,value){
return this._should(property,value,"===");
},
property_should_not_be:function (property,value){
return this._should(property,value,"!==");
},

log: function(message){
Logger.log(this.self,message);
}
});


一个小问题:
由于qwrap的单元测试每个用户只跑一次,导致有时候在某些浏览器下,错误行号不是我们想要的。
所以在实际的应用中,可能会看到有的断言后面多了一个.line的尾巴:
value_of(a).should('<',3).line
它是解决行号不准的一个方案。不过某些编码规范检查工具会拒掉这种写法。可以改成“.toString()”来通过检查。

另:其实这里的主语Subject:
UnitTest.Subject=function (self){
this.self=self;
};
window.value_of=function (self){
return new UnitTest.Subject(self);
};

它也是一个QWrap里所说到的wrap(为了保护核对象(core)的纯净,在外面包一层皮(wrap))。不过,它的核的名字,不是叫qwrap所推荐的"core",而是叫"self"。

单元测试在QWrap的开发中,已经有很成熟的应用,如:
qwrap的core的单元测试:http://dev.qwrap.com/resource/js/core/_tests/UnitTest_Core.html
qwrap的core_dom_retouch单元测试:http://dev.qwrap.com/resource/js/dom/_tests/UnitTest_Dom.html
我们在修改代码后,都会运行一下单元测试,以确保以前的功能没有被改坏。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: