Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1285880
  • 博文数量: 315
  • 博客积分: 10397
  • 博客等级: 上将
  • 技术积分: 3731
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-07 21:21
文章分类

全部博文(315)

文章存档

2015年(10)

2014年(3)

2013年(2)

2012年(8)

2011年(8)

2010年(29)

2009年(59)

2008年(77)

2007年(119)

分类: 系统运维

2009-07-03 14:48:40

转自:

flex和后台打交道几乎都是异步方式的,我最近就在team里面负责service层(一些mvc框架里称作proxy层)的编码工作,撇开传统的Alert,Trace等调试方式,决定引入正规的单元测试flexunit,但是对于异步操作来说,单元测试并非十分简单,网上找了些英文资料,实践后整理一份教材供大家参考

关于flexunit的一些基础知识可以参考我的上一篇文章”“。

首先看一下我们的service类,这里为了便于演示代码使用HttpService方式

首先建一个xml作为访问资源

>
    >192.168.1.100>
>

随后建立一个方法使用httpService来访问这个xml资源

public class MyService
{
    private var getDomainRetFun:Function;
    public function getDomain(retFun:Function):void
    {
        getDomainRetFun = retFun;
        var service:HTTPService = new HTTPService();
        service.url = "assets/domain.xml";
        service.addEventListener(ResultEvent.RESULT,getDomainHandler);
        service.send();
    }
 
    private function getDomainHandler(evt:ResultEvent):void
    {
        if(evt.result!=null)
        {
            var ip:String = evt.result.domain.ip
            getDomainRetFun(ip);
        }
        else
        {
            getDomainRetFun("error");
        }
    }
}

接下来写testCase,我们可以看到这里使用了一个timer来延迟断言执行的时间。这里设置延迟3000毫秒,addAsync()函数是由父类TestCase实现,设置的是3秒延迟过后需要执行的函数 第一个参数为 需要执行断言的 回调函数名 ,第二个参数是timeout,第三个为传递给回调函数的参数,我们这里就设置前2个即可

public class MyServiceTest extends TestCase
{
    private var timer:Timer;
    private var myService:MyService;
 
    public function MyServiceTest(methodName:String=null)
    {
        super(methodName);
    }
 
    override public function setUp():void
    {
        timer = new Timer( 3000, 1 );                    
        myService = new MyService();
        super.setUp();
    }               
    override public function tearDown():void
    {
        timer.stop();
        timer = null;
        myService = null;
        super.tearDown();
    }
    //设置一个临时变量来存放回调函数返回结果,以用于断言时候的比较
    private var tmp:String = "";
 
    public function testGetDomain():void
    {
        timer.addEventListener(TimerEvent.TIMER_COMPLETE,addAsync(handleTimerComplete,5000));
        timer.start();
        myService.getDomain(getDomainCompelet);
    }
 
    private function getDomainCompelet(ip:String):void
    {
        tmp = ip;
    }
 
    private function handleTimerComplete(evt:TimerEvent):void
    {
        Assert.assertEquals("192.168.1.100",tmp);
    }           
}

ui方面加入suite后就就可以run test了

如果有错误则会提示

flexunit来测试异步或者测试事件还是有些繁琐的。有些时候还不如Alert来的简单明了,这一点上大家仁者见仁智者见智了。

ui开发方面的测试还是以视觉为准吧,至于那些看不见效果的service层或者util类上,使用flexunit来进行单元测试还是十分有必要的。

阅读(859) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~