2010-07-24 22 views
2

有关于FlexUnit4中的异步方法的文档页面:http://docs.flexunit.org/index.php?title=Writing_an_AsyncTestFlexUnit4中异步测试 - 异步处理的使用并不清楚

下面是交代不清,我的理念:

// timer is a Timer instance set to tick once with a delay of TIMER_TIME. 

[Test(async)] 
public function testAsync() : void { 
     var asyncHandler:Function = Async.asyncHandler(this, handleTimerComplete, ASYNC_TIME, null, handleTimeout); 
     timer.addEventListener(TimerEvent.TIMER_COMPLETE, asyncHandler, false, 0, true); 
     timer.start();  
} 

handleTimerComplete被称为计时器时对象完成(在TIMER_TIME之后)。它仅在TIMER_TIME < ASYNC_TIME时发生。如果asyncHandler完成(在ASYNC_TIME之后),则调用handleTimeout。它发生如果ASYNC_TIME < TIMER_TIME。

这对我来说确实没有意义。我期望定期调用一个测试函数,并且一旦测试成功,定期调用应该成功完成。另一方面,我不确定将操作放到哪里(我想测试什么)以及放置测试(断言)的位置。

是否有更详细的文档或示例来阐明该方法?

谢谢!

+0

同时我发现了一些例子中完整的源: SVN共http://opensource.adobe.com/svn/opensource/flexunit/branches/4.x 下包flexUnitTests.flexUnit4.suites.frameworkSuite.cases 。 – itarato 2010-07-24 15:29:13

回答

0

即时通讯刚刚开始使用asyncHandlers,并且如果您的handleTimerComplete函数触发,那么在该函数中您可以添加断言通道,在超时断言失败。

对我来说它的HTTP事件,所以在我的“通行证”处理程序我也可以使用断言来检查正确的状态码等

有一件事我试图找出是,如果你可以重新使用相同的异步处理程序,例如将它作为3或4种不同类型的事件的监听器连接起来,到目前为止,我认为不是,看起来第二次调用它会得到一个错误,即处理函数指针现在为空。需要做更多的调查,虽然

0

断言基本上做到这一点:

function assertEquals(value:*, ...rest) : void { 
    for each(var item:* in rest) 
     if(item != value) throw new Error("fail"); 
} 

这(伪代码)断言检查是否获得通过,在有预期值,并抛出一个错误,如果参数他们别。所以,对于可以放置断言的位置真的没有限制 - 它们只是普通的旧方法,如果某些条件未得到满足,则会引发错误。

单元测试框架在try/catch块内运行每个测试方法,并且任何由断言引发的意外错误都会导致测试失败。这就是其他测试仍然可以继续运行的原因,以及如何获得日志消息和结果,即使发生了可怕的错误。

问题是:如果必须进行异步断言,即在稍后的时间点检查变量值,则测试框架的行为变得更加复杂。不管怎样,在主测试方法结束和实际测试结束之间发生的所有方法调用也必须受到监视,在setUp()中实例化的对象必须继续存在,并且必须仍然捕获所有错误 - 否则,整个测试运行者会崩溃,并且你会得到很多“空对象引用”错误。

框架,但是,不知道在当前测试完成后,除非有某种方式的信号完整性 - 因为这个原因,你必须如果你只使用至少一个asyncHandler(或failOnEvent/proceedOnEvent,需要验证一个事件是否发送/根本没有调度)来处理标记测试结束的事件,即在您的情况下,TimerEvent.TIMER_COMPLETE - 或者如果从未遇到过该事件,则会失败。无论哪种情况,现在都可以运行下一个测试。

我相信这是好的在同一个测试使用几个asyncHandlers,但我不知道一个asyncHandler将正常工作,如果所谓的多次循环 - 以某种方式违背了超时功能。为了让事情保持良好的可读性,并且为了预测测试结束的地方,我建议每次测试只使用一个asyncHandler - 并将所有其他断言放入“常规”事件处理程序方法中。

btw如果您对FlexUnit的其余部分如何工作感兴趣,可以找到full source code at GitHub