0

このAsyncHelperを使用しています。テスト メソッドから (Parsley MessageDispatcher によって) イベントをディスパッチし、他のメソッドでこのイベントをキャッチして (flex EventDispatcher によって) ディスパッチする基本的なテスト ケースを作成したいと思います。

これは私のテストケースです: package flexUnitTests { import flash.events.ErrorEvent; import flash.events.Event; import flash.events.EventDispatcher;

import flexUnitTests.events.TestEvent;
import flexUnitTests.helpers.AsyncHelper;

import mx.logging.Log;
import mx.logging.LogEventLevel;
import mx.logging.targets.TraceTarget;

import org.flexunit.assertThat;
import org.hamcrest.object.equalTo;
import org.spicefactory.parsley.core.context.Context;
import org.spicefactory.parsley.core.messaging.MessageProcessor;
import org.spicefactory.parsley.dsl.context.ContextBuilder;
import org.spicefactory.parsley.flex.FlexConfig;
import org.spicefactory.parsley.flex.FlexContextBuilder;

public class HelloTest extends AsyncHelper {

    [MessageDispatcher]
    public var dispatcher:Function;

    [Inject]
    public var context:Context;

    public var eventDispatcher:EventDispatcher;

    [Before]
    public function initializeContext():void {
        // Use ContextBuilder to build context
        var context:Context = ContextBuilder.newSetup()
            .newBuilder()
            .config(FlexConfig.forClass(ParsleyConfig))
            .build();

        // Add this test case to context 
        context.addDynamicObject(this);

        eventDispatcher = new EventDispatcher();
    }

    [After]
    public function destroyContext():void {
        eventDispatcher = null;
    }

    [MessageHandler(selector='TestEvent.ok')]
    public function passItOn(event:TestEvent):void {
        eventDispatcher.dispatchEvent(event);
    }

    [Test(async)]
    public function tryIt():void {
        dispatcher(new TestEvent(TestEvent.OK));
        waitFor(eventDispatcher, TestEvent.OK, 2000);
        thenAssert(function(event:TestEvent, data:*):void {
            assertThat(event.type, equalTo('TestEvent.ok'));
        });
    }
}

}

そして、私のイベントは次のようになります。 package flexUnitTests.events { import flash.events.Event;

public class TestEvent extends Event
{
    static public const OK :String = "TestEvent.ok";

    public function TestEvent(type:String)
    {
        super(type);
    }
}

}

どこが問題なのかわからない。コードでトレースを作成すると、Parsley がイベントを passItOn メソッドにディスパッチすることがわかります。そして、EventDispatcher ディスパッチ イベントを元に戻します。しかし、SequenceWaiter がイベントを認識しない理由がわかりません。

4

1 に答える 1

0

どこに問題があるのか​​ わかります。シーケンスを作成する前にdispatcher()を呼び出すためです。メソッドを呼び出す順序を変更すると、問題がなくなります。

于 2011-07-09T09:47:52.550 に答える