【问题标题】:Flex unit aysnc problem: Error: Asynchronous Event Received out of OrderFlex 单元异步问题:错误:异步事件接收无序
【发布时间】:2011-09-08 03:24:01
【问题描述】:

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

代码sn-ps:

[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);

    }

【问题讨论】:

    标签: apache-flex actionscript flex4 adobe flexunit4


    【解决方案1】:

    那是因为您正在向测试用例添加顺序,这似乎是在第一个完成之前正在调度其他东西。引用 flex unit wiki 的订购部分:

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

    我完全同意。在您的测试中不应该有任何顺序。测试本身设定了需要完成的状态。

    【讨论】:

    • 谢谢。你的意思是我应该在 [Test(order=1, async, description="synchronize content on line")] 中删除 order=1?我试了一下,还是这个失败。我添加了两个 aysnc 处理程序。是这个问题吗?
    • 实际上,我认为您可以拥有 2 个异步处理程序,但它们需要按顺序排列。尝试在错误处理程序之前创建结果处理程序。
    【解决方案2】:

    如果您分别测试成功和失败,您的测试将起作用。所以基本上有 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 中删除它的引用,如简单的代码 sn-p 所示,我刚刚假设 caseManager 的类型是 CaseManager。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多