作为一个新特性,Flash Builder 4已经集成FlexUnit Test,使用起来很方便,下面我们就以一个Case来谈谈怎样在Flash Builder 4中进行Unit Test。
1. 准备工作。首先用Flash Builder 4在一个Flex工程新建一个类。如下面代码。
- package
- {
- import flash.utils.ByteArray;
-
- public class ObjectUtil
- {
- public static function clone(source:*):*
- {
- var ba:ByteArray = new ByteArray();
- ba.writeObject(source);
- ba.position = 0;
- return ba.readObject();
- }
- }
- }
复制代码
这个工具类实现发对象的深度clone,也就是被复制的目标对象不再是源对象的参照,改变目标对象不会影响源对象。因为ActionScript 3.0和Flex Framework中有不少内置对象,如Date、Object、Array、ArrayColection、BitmapData对象,情况比较多,单元测试正好派上用场。
2. 创建新的FlexUnit TestCase 类。
选择该类>新建>TestCase 类,打开下图所示对话框,一般按默认设置就行了。下图所示。
选择应为其生成测试方法存根的方法。下图所示。
Flash Builder 4将自动为我们生成TestCase类和主程序文件的结构代码。在TestCase类中,已经有一个没有实现的测试方法,为方便错误跟踪,我们修改成了四个测试方法。如下代码所示。
- public function testCloneObject():void
- {
- var obj:Object= {name:"Jim", age:25}
- var newObj:Object = ObjectUtil.clone(obj);
- newObj.age = 28;
- assertObjectEquals(obj, {name:"Jim", age:25});
- }
-
- public function testCloneArray():void
- {
- var arr:Array= [1,2];
- var newArr:Array = ObjectUtil.clone(arr);
- newArr[1] = 3;
- assertObjectEquals(arr, [1,2]);
- }
-
- public function testCloneCollection():void
- {
- var ac:ArrayCollection = new ArrayCollection([
- {name:"Jim", age:28},
- {name:"Tom", age:30}
- ]);
-
- var newAC:ArrayCollection = ObjectUtil.clone(ac);
- newAC.getItemAt(0).name = "Kite";
- assertEquals(ac.getItemAt(0).name, "Jim");
- }
-
- public function testBitmapData():void
- {
- var bmd:BitmapData = new BitmapData(100,100,false);
- bmd.setPixel(10,10,0xFF0000);
- var newBMD:BitmapData = ObjectUtil.clone(bmd);
- newBMD.setPixel(10,10,0x0000FF);;
- assertEquals(bmd.getPixel(10,10), 0x00FF0000);
- }
复制代码
3. 创建新的FlexUnit Test Suite 类。选择该类>新建>TestSuie类,打开对话框,输入TestSuie类名,选择目标测试类和方法。下图所示。
4. 修改主程序。
打开主程序mxml,做如下修改。
- <?xml version="1.0" encoding="utf-8"?>
- <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
- xmlns:s="library://ns.adobe.com/flex/spark"
- xmlns:flexui="flexunit.flexui.*"
- xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="800" minHeight="600"
- creationComplete="creationCompleteHandler()">
- <fx:Script>
- <![CDATA[
- import flexUnitTests.UtilSuite;
-
- private var flexUnitTests_UtilSuite_obj:flexUnitTests.UtilSuite;
-
- protected function creationCompleteHandler():void
- {
- testRunner.test = UtilSuite.suite();
- testRunner.startTest();
- }
- ]]>
- </fx:Script>
-
- <flexui:TestRunnerBase id="testRunner"
- width="100%" height="100%"/>
-
- </s:Application>
复制代码
5. 运行测试程序。
结果testBitmapData()方法测试失败:TypeError: Error #1034: 强制转换类型失败:无法将 Object@b9b5fb1 转换为 flash.display.BitmapData。
6. 修改错误。其实,BitmapData有自己的clone方法,我们只要将这个方法整合到ObjectUtil类中就行了。
打开ObjectUtil类,添加一个条件,最终代码如下。
- public static function clone(source:*):*
- {
- var ba:ByteArray = new ByteArray();
- ba.writeObject(source);
- ba.position = 0;
- if(source is BitmapData)
- {
- return (source as BitmapData).clone();
- }
- return ba.readObject();
- }
复制代码
回到第五步再进行测试,直到全部方法都通过。
(责任编辑:admin) |