asunit是actionscript的一个单元测试框架, 对于同步执行的函数不用多说, 网上能查到很多资料.

但是actionscript里存在大量的异步函数, 如load,dispatchEventListener.

如果涉及到这些异步的函数应该怎样测试呢?

例如

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
public class Tmp
{
    public var _bitmap:Bitmap;
            private var _func:Function;
    public function Tmp()
    {

    }

    public function loadRes(func:Function):void {
        var loader:Loader = new Loader();
        loader.loaderInfo.addEventListener(Event.COMPLETE, loaded);
                    _func = func;
        loader.load(new URLRequest("test.jpg"));
    }

    private function loaded(e:Event):void
    {
        _bitmap = (e.target as LoaderInfo).loader.content;
    }
    }

我们怎么测试loadRes有没有正确执行呢?

其实asunit已经为我们提供了异步测试函数addAsync

我们只需要创建一个TestCase

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class AssetManagerTest extends TestCase
{
    private var _tmp:Tmp;

    public function AssetManagerTest(methodName:String=null)
    {
        super(methodName);
    }

    override protected function setUp():void {
        super.setUp();
        _tmp= new Tmp();
    }

    override protected function tearDown():void {
        super.tearDown();
    }

    public function testLoadRes():void {
        _tmp.loadRes(addAsync(checkLoadRes));
    }

    ////////////////////////////////////////////
    private function checkLoadRes():void {
        assertNotNull(_tmp._bitmap);
    }
}

需要注意的是,我们的回调函数一定要用asunit的addAsync包装一下. 这样asunint才会等待一定的时间执行检测函数,否则起不到测试效果.

addAsync具体用法可以看一下源码,还有一些参数可用