在说明问题之前,大家就看一个例子:

import flexunit.framework.TestCase;

import flexunit.framework.Assert;

import flash.utils.Timer;

import flash.events.TimerEvent;

public class TimerTest extends TestCase {

private var _timerCount:int;

public function TimerTest(methodName:String) {

super(methodName);

_timerCount = 0;

}

public function testTimer():void {

var timer:Timer = new Timer(3000, 1);

timer.addEventListener(TimerEvent.TIMER, incrementCount);

timer.addEventListener(TimerEvent.TIMER_COMPLETE, verifyCount);

timer.start();

}

private function incrementCount(timerEvent:TimerEvent):void {

_timerCount++;

}

private function verifyCount(timerEvent:TimerEvent):void {

Assert. assertEquals(1, _timerCount);

}

}

我们要对testTimer()方法进行测试,程序很简单,当我们测试testTimer时,内里并没有抛出任何错误,因此我们看到的结果是正确的,但是当3秒过后,程序会自动执行verifyCount( )函数,这函数体里有assertEquals(1,_timerCount) 这个语句,显然,我们在incrementCount( )方法里把_timerCount增加了,因为timer只执行一次,所以_timerCount的值应为1,那么我们比较的结果应该是正确的。但如果我们这样写呢:

Assert. assertEquals(100, _timerCount);

我们可以看到,TestRunnerBase里依然显示正确,这是为什么呢?因为这个比较是在3秒后才执行的,在测试testTimer( )的时间只需短短的十几毫秒,那时并没有抛出任何错误,当testTimer( )执行完毕,该testcase便会被清除,于是就认为测试通过。

说到这里,大家就会开始想解决以上问题的方法。在FlexUnit中,使用了addAsync()这个函数来解决上述问题。下面我们介绍addAsync( )函数的用法:

addAsync( )有四个参数:

1、 触发的事件函数。

2、 监听的时间,单位为毫秒。

3、 事件函数的参数,类型为Object,默认为空。

4、 失败所要调用的函数,如果在指定时间内没有触发事件,则断言失败。默认为空。

另外,addAsync()方法的返回值是一个函数。

我们把上面的例子改为:

public class TimerTest extends TestCase {

private var _timerCount:int;

public function TimerTest(methodName:String) {

super(methodName);

_timerCount = 0;

}

public function testTimer():void {

var timer:Timer = new Timer(3000, 1);

timer.addEventListener(TimerEvent.TIMER, incrementCount);

timer.addEventListener(TimerEvent.TIMER_COMPLETE, addAsync(verifyCount , 3500) );

timer.start();

}

private function incrementCount(timerEvent:TimerEvent):void {

_timerCount++;

}

private function verifyCount(timerEvent:TimerEvent):void {

Assert. assertEquals(15, _timerCount);

}

}

这里,我们运行的时候,会发现程序在等待:

3秒之后就会出现如下结果:

这里有一点要注意,如果我们这样写:

public function testTimer():void {

addAsync(verifyCount, 5000);

_timer = new Timer(3000, 1);

_timer.addEventListener(TimerEvent.TIMER, verifyCount );

_timer.start();

}

或者这样写:

public function testTimer():void {

var function:Function = verifyCount;

addAsync(function, 5000);

_timer = new Timer(3000, 1);

_timer.addEventListener(TimerEvent.TIMER, function);

_timer.start();

}

都会提示为:“Asynchronous function did not fire after 5000 ms”这样的错误。这是为什么呢?明明在5秒的时间内verifyCount函数被执行了。

但是当然们改成这样时:

public function testTimer():void {

var function:Function = addAsync(verifyCount, 5000);

_timer = new Timer(3000, 1);

_timer.addEventListener(TimerEvent.TIMER, function);

_timer.start();

}

结果就正确了,那么大家就可以猜到,我们使用addAsync(verifyCount, 5000) 方法,并不是断言verifyCount是否被执行了,而是断言addAsync()方法所返回的函数是否被执行了,如果有执行,我们就调用verifyCount方法,如果没有就断言失败。

另外要提一下的是,TestCase里还有setUp( )和tearDown( )两个函数。setUp 方法将在每个测试方法之前运行,用于搭建通用的初始设置。tearDown 方法将在每个测试方法之后运行,用于进行通用的卸载或清除工作。 setUp 和 tearDown 方法是该 TestCase 对象中的每个测试方法运行一次,而非对这个测试用例运行一次。

转载于:https://www.cnblogs.com/fxair/archive/2010/04/13/1710741.html

FlexUnit单元测试(第三章FlexUnit事件断言)相关推荐

  1. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

    第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是行不 通.如果大家开发的是WinForm中的事件,之前的定义可能没有什 ...

  2. ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

    第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.N ...

  3. 第三章 UT单元测试——CPU与内存使用率限制

    系列文章目录 第一章 UT单元测试--GoogleTest通用构建说明 第二章 UT单元测试--GTest框架实例 第三章 UT单元测试--CPU与内存使用率限制 文章目录 系列文章目录 前言 一.环 ...

  4. 慕课软件质量保证与测试(第三章.单元测试)

    慕课金陵科技学院.软件质量保证与测试.第三章.黑盒测试.单元测试 0 目录 3 黑盒测试 3.9 单元测试 3.9.1课堂重点 3.9.2测试与作业 4 下一章 0 目录 3 黑盒测试 3.9 单元测 ...

  5. 走向.NET架构设计—第三章—分层设计,初涉架构(后篇)

    走向.NET架构设计-第三章-分层设计,初涉架构(后篇) 前言:本篇主要是接着前两篇文章继续讲述! 本篇的议题如下: 4. 数据访问层设计 5. 显示层设计 6. UI层设计   4.  数据访问层设 ...

  6. 【黑金原创教程】【Modelsim】【第三章】理想就是美丽

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...

  7. C++ API 设计 08 第三章 模式

    第三章 模式 前一章所讨论的品质是用来区分设计良好和糟糕的API.在接下来的几个章节将重点关注构建高品质的API的技术和原则.这个特殊的章节将涵盖一些有用的设计模式和C++ API设计的相关习惯用法. ...

  8. ACPI Specification 第三章 ACPI概念

    目录 第三章 ACPI 概念... 2 3.1系统电源管理... 3 3.2电源状态... 3 3.2.1电源按钮... 4 3.2.2平台电源管理特点... 5 3.2.2.1移动电脑... 5 3 ...

  9. 第三章 信息系统集成专业技术知识

    第三章 信息系统集成专业技术知识 知识点 1.信息系统的生命周期有哪几个过程 2.信息系统开发的方法有几种:各种用于什么情况的项目. 3.软件需求的定义及分类: 4.软件设计的基本原则是什么: 5.软 ...

最新文章

  1. Java 门面模式 浅析
  2. Qt Creator IDE概述
  3. linux内核对伙伴系统的改进--migrate_type
  4. 2020-09-26
  5. 当心Spring缓慢的事务回调
  6. (第1部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...
  7. yml的mybatis的sql查看
  8. 使用Express和MongoDB构建简单的CRUD应用程序
  9. 阿里P8架构师谈:流量高峰时期的性能瓶颈有哪些、以及如何来解决
  10. BOM函数之history对象
  11. C#LeetCode刷题之#844-比较含退格的字符串​​​​​​​(Backspace String Compare)
  12. BDD(行为驱动开发)
  13. Webstorm 下的Angular2.0开发之路
  14. gps 捕获 matlab,基于FFT的GPS信号快速捕获方法
  15. 常用背景色RGB配色如下:
  16. 【Javascript】用 js 写一个模板引擎
  17. 【MySQL 8.0】导入 .frm .MYD .MYI
  18. UVA - 1389 Hard Life【分数规划+最小割】【最大权闭合图】
  19. 史上最全的工业相机CCD/CMOS靶面尺寸规格说明
  20. 图像处理 灰度变换与空间滤波

热门文章

  1. react antD moment
  2. Django框架视图类
  3. 关于子元素的margin-top对父级容器无效
  4. Netty实战七之EventLoop和线程模型
  5. 洛谷P4609 [FJOI2016]建筑师 【第一类斯特林数】
  6. 如何解决虚拟机频繁分离和附加磁盘导致的识别错误
  7. hdu 2085 核反应堆
  8. Android 事件分发面试题2
  9. 【剑指offer-Java版】41和为s的两个数字VS和为s的连续正数序列
  10. 第八周项目一-数组作数据成员(2)