How to use SequenceRunner with FlexUnit 4
Hi,
I just read the Wiki page about Fluint Sequences at http://docs.flexunit.org/index.php?title=Sequences#Sequences_from_Fluint. I really would like to use sequences as it seems a great way to test flows in UI components.
So I created a first test based on the examples in the wiki. Unfortunately it does not work as I hoped.
The testcase:
package flex.filter.eventFilter.view
{
import flash.events.Event;
import mx.events.FlexEvent;
import net.digitalprimates.fluint.tests.TestCase;
import org.fluint.sequence.SequenceRunner;
import org.fluint.sequence.SequenceSetter;
import org.fluint.sequence.SequenceWaiter;
public class RelativeDateInputFluintSequence extends TestCase
{
private var form:RelativeDateInput;
[Before(async)]
override protected function setUp():void
{
form = new RelativeDateInput();
form.addEventListener(FlexEvent.CREATION_COMPLETE, asyncHandler (pendUntilComplete, 100), false, 0, true);
addChild(form);
}
[After(async)]
override protected function tearDown():void
{
removeChild(form);
form = null;
}
[Test(async)]
public function testForm():void
{
var passThroughData:Object = new Object();
passThroughData.value = 5;
passThroughData.selectedUnit = "hours";
var sequence:SequenceRunner = new SequenceRunner(this);
// Set time in stepper
sequence.addStep (new SequenceSetter(form.timeStepper, {value:passThroughData.value}));
sequence.addStep(new SequenceWaiter(form.timeStepper, FlexEvent.VALUE_COMMIT, 100));
// Set units
sequence.addStep (new SequenceSetter(form.unitCombo, {selectedItem:passThroughData.selectedUnit}));
sequence.addStep(new SequenceWaiter(form.timeStepper, FlexEvent.VALUE_COMMIT, 100));
sequence.addAssertHandler(handleFiveHoursSet, passThroughData);
sequence.run();
}
private function handleFiveHoursSet(event:Event, passThroughData:Object):void
{
assertEquals(passThroughData.value * 60 * 60000, form.milliseconds);
}
}
}
Note that I did not add the test annotations at first as they were ommitted in the Wiki. I added these later after I got the error below.
When sequence.run() is executed I get this error:
Cannot add asynchronous functionality to methods defined by Test,Before or After that are not marked async
Error: Cannot add asynchronous functionality to methods defined by Test,Before or After that are not marked async
at org.flexunit.async::AsyncLocator$/getCallableForTest()
at org.fluint.sequence::SequenceWaiter/setupListeners()
at org.fluint.sequence::SequenceRunner/continueSequence()
at org.fluint.sequence::SequenceRunner/run()
at com.hp.opr.flex.filter.eventFilter.view::RelativeDateInputFluintSequence/testForm()[/home/cschlipf/data/dev/svn/opr/components/common/flex/lib/opr-fx-common/src/test/flex/com/hp/opr/flex/filter/eventFilter/view/RelativeDateInputFluintSequence.as:56]
at net.digitalprimates.fluint.tests::TestCase/protect()
at Function/http://adobe.com/AS3/2006/builtin::apply()
at net.digitalprimates.fluint.tests::TestCase/executeMethodWhileProtected()
at net.digitalprimates.fluint.tests::TestCase/runTestMethod()
at net.digitalprimates.fluint.ui::TestRunner/runTestMethod()
at net.digitalprimates.fluint.ui::TestRunner/handleTestProcess()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at net.digitalprimates.fluint.tests::TestCase/handleAsyncEventFired()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at net.digitalprimates.fluint.async::AsyncHandler/handleEvent()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()
at mx.core::UIComponent/set initialized()
at mx.managers::LayoutManager/doPhasedInstantiation()
at Function/http://adobe.com/AS3/2006/builtin::apply()
at mx.core::UIComponent/callLaterDispatcher2()
at mx.core::UIComponent/callLaterDispatcher()
So my guess is that the SequenceRunner is not fully compatible with FlexUnit 4 as asyncronous calls that are internal to the SequenceRunner are not marked as async.
Best regards,
Carsten
