作為一個新特性,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類中,已經有一個沒有實現的測試方法testClone,為方便錯誤跟蹤,我們修改成了四個測試方。如下代碼所示。
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), 0xFF0000); }
注意,在FlexUnit 1 test中, 每個你創建的方法的方法名都必須以test開頭, 這個是為了讓測試運行器辨識需要測試的方法。
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(); }
回到第五步再進行測試,直到全部方法都通過。
另外,FlexUnit 4 test所用代碼更簡單,還支持元數據標簽。通過運行方式>FlexUnit 測試,可以直接生成主程序代碼。FlexUnit 4 test的界面是總結性的,很簡單,還有就是FlexUnit 面版,大家有空可以試一下。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
