2

有关于 FlexUnit4 的异步方法的文档页面:http ://docs.flexunit.org/index.php?title=Writing_an_AsyncTest

这是让我感到困惑的概念:

// 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();    
}

当计时器对象完成时(在 TIMER_TIME 之后)调用 handleTimerComplete。它仅在 TIMER_TIME < ASYNC_TIME 时发生。如果 asyncHandler 完成(在 ASYNC_TIME 之后),则调用 handleTimeout。如果 ASYNC_TIME < TIMER_TIME,就会发生这种情况。

这对我来说真的没有意义。我希望定期调用一个有时间限制的测试函数,一旦测试成功,定期调用应该成功完成。另一方面,我不确定在哪里放置操作(我想测试什么)以及在哪里放置测试(断言)。

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

谢谢!

4

2 回答 2

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如果在循环中多次调用 an 是否能正常工作 - 这在某种程度上与超时功能相矛盾。

为了使事情保持良好的可读性,并为自己标记您希望测试结束的位置,我建议asyncHandler每个测试只使用一个 - 并将所有其他断言放入“常规”事件处理程序方法中。

顺便说一句,如果您对 FlexUnit 的其余部分如何工作感兴趣,您可以在 GitHub 上找到完整的源代码

于 2012-12-02T16:28:23.633 回答
0

我刚刚开始使用 asyncHandlers 并且我一直在采用这样的方法,即如果您的 handleTimerComplete 函数触发,那么在该函数中您可以添加您的断言传递,在您断言失败的超时中。

对我来说它的 http 事件,所以在我的“通过”处理程序中,我还可以使用 assert 检查正确的状态代码等。

我想弄清楚的一件事是您是否可以重复使用相同的异步处理程序,例如将其链接为 3 或 4 个不同类型事件的侦听器,到目前为止我认为不,似乎第二次调用它你得到一个错误,处理函数指针现在为空。虽然需要做更多的调查

于 2012-12-02T12:22:45.533 回答