#### 1.3 测试函数、用例和套件(2)
到目前为止,这些测试都很清晰简单,每个测试都只用了一个断言。现在,上面的测试用例把所有的测试都组合进了一个对象,但是,由于这个date对象还是在外部创建的,所以这让事情看起来不太自然,因为它似乎应该是测试的一部分。当然,我们确实可以在每个测试中都创建一个对象,但因为创建这些对象的方式完全相同,所以这样就等于重复做了很多遍同样的事情,而这并不是必要的。所以,更好的选择是把通用的设置代码都放在一个单独的地方。
Setup和Teardown
在xUnit框架里通常会提供setUp(设置)和tearDown(拆除)方法,用来集中设置并提供测试数据,也叫测试配件文件,所以,它们通常会在每个测试之前和之后分别调用。下面,让我们用SetUp方法把date对象加进来作为一个测试配件文件。正如清单1.12显示的,更改过的testCase函数检查测试用例是否有setUp和tearDown,如果有的话,在适当的时候运行它们。
清单1.12 在testCase里实现setUp和tearDown
~~~
function testCase(name,tests){
assert.count =0;
var successful =0;
var testCount =0;
var hasSetup =typeof tests.setUp =="function";
var hasTeardown =typeof tests.tearDown =="function";
for (var test in tests){
if (!/^test/.test(test)){
continue;
}
testCount++;
try {
if (hasSetup){
tests.setUp();
}
tests [test ]();
output(test,"#0c0");
if (hasTeardown){
tests.tearDown();
}
//If the tearDown method throws an error,it is
//considered a test failure,so we don't count
//success until all methods have run successfully
successful++;
} catch (e){
output(test +"failed:"+e.message,"#c00");
}
}
var color =successful ==testCount ?"#0c0":"#c00";
output("<strong>"+testCount +"tests,"+
(testCount -successful)+"failures</strong>",
color);
}
~~~
用新加的setUp方法,我们可以增加一个对象属性来存放测试配件文件,如清单1.13所示。
清单1.13 在strftime测试用例中使用setUp
~~~
testCase("strftime test",{
setUp:function (){
this.date =new Date(2009,9,2,22,14,45);
},
"test format specifier Y":function (){
assert("%Y should return full year",
this.date.strftime("%Y")==2009);
},
//...
});
~~~