Flex单元异步问题:错误:异步事件收到了无序

时间:2011-09-08 03:24:02

标签: flex actionscript flex4 adobe flexunit4

我正在用flexunit 4编写测试用例来测试函数。我正在使用aysnc方法。 但是当我向实例添加两个或更多asyncHandler时。我遇到了问题:错误:异步事件收到了无序。如何解决这个问题?感谢。

代码段:

[Test(order=1, async, description="synchronize content on line")]
    public function  testSynchronizeContentOnline():void
    {
        var passThroughData:Object = new Object();

        var asyncHandler1:Function = Async.asyncHandler(this, authFailureHandler, 60000, null, timeoutHandler);
        var asyncHandler:Function = Async.asyncHandler(this, authSuccessHandler, 60000, null, timeoutHandler);

        caseManager.addEventListener(CaseAuthEvent.AUTH_SUCCESS, 
            asyncHandler);

        caseManager.addEventListener(CaseAuthEvent.AUTH_FAILURE, 
            asyncHandler1);
        caseManager.authenticate("admin", "admin");

        trace('test');
    }

    private function timeoutHandler(event:Event):void 
    {
        Assert.fail( "Timeout reached before event");
    }

    private var authFailed:Boolean = false;
    private function authFailureHandler(event:CaseAuthEvent, passThroughData:Object):void
    {
        trace("authFailure:" + event.type);
        authFailed = true;

    }

    private var authSucceed:Boolean = false;
    private function authSuccessHandler(event:CaseAuthEvent, passThroughData:Object):void
    {
        trace("authSucceed:" + event.type);
        authSucceed = true;
        Assert.assertTrue(true);

    }

2 个答案:

答案 0 :(得分:0)

那是因为你正在为你的测试用例添加顺序,这似乎是在第一个完成之前调度的东西。引用flex单元维基的订购部分:

  

你的测试需要彼此独立行动,所以重点   以自定义方式排序测试不是为了确保测试A设置   测试B需要的一些状态。如果这是你正在阅读的原因   本节请重新考虑。测试需要独立于每个测试   其他并且通常独立于订单。

我完全赞同。 不应该是您测试中的任何订单。测试本身设定了需要完成的状态。

答案 1 :(得分:0)

如果您测试成功并且单独失败,您的测试将起作用。所以基本上有2个测试,一个为事件成功添加异步处理程序,另一个为事件失败。以下是我接近它们的2个测试的例子......

[Test(async)]
public function  testEventSuccess():void
{
    var passThroughData:Object = new Object();

    var asyncHandler:Function = Async.asyncHandler(this, authSuccessHandler, 60000, null, timeoutHandler);

    caseManager.addEventListener(CaseAuthEvent.AUTH_SUCCESS, 
        asyncHandler);

    caseManager.authenticate("admin", "admin");
}

[Test(async)]
public function  testEventFailure():void
{
    var passThroughData:Object = new Object();

    var asyncHandler:Function = Async.asyncHandler(this, authFailureHandler, 60000, null, timeoutHandler);

    caseManager.addEventListener(CaseAuthEvent.AUTH_FAILURE, 
        asyncHandler);
    caseManager.authenticate("admin", "admin");
}

请记住在你的设置函数中创建一个caseManager的新实例,以及在tearDown中删除ref对它的好习惯,就像简单的代码片段所示,我假设caseManager是CaseManager类型。

[Before]
public function setUp():void
{
    caseManager = new CaseManager();
}

[After]
public function tearDown():void
{
    caseManager = null;
}