AutowiredTestCase
One of the utility classes that is part of the Swiz library is AutowiredTestCase
. As the name implies, you can use this class to help test your Swiz applications. Let's look at a sample FlexUnit 4 test that uses AutowiredTestCase
. First, the class under test:
package org.swizframework.testapp.control { import org.swizframework.testapp.event.MyEvent; import flash.events.IEventDispatcher; public class MyController { [Dispatcher] public var dispatcher : IEventDispatcher; public var didSomething : Boolean = false; [EventHandler( event="MyEvent.CONTROLLER_ACTION_REQUESTED" )] public function handleAction() : void { didSomething = true; dispatcher.dispatchEvent( new MyEvent( MyEvent.CONTROLLER_ACTION_COMPLETE ) ); } } }
You can see this is a simple controller, which responds to the CONTROLLER_ACTION_REQUESTED
event, updates a property, and then dispatches CONTROLLER_ACTION_COMPLETE
. We want to test that the controller is responding to the correct event, property updating the property, and finally dispatching the completion event.
The event itself is a simple event class:
package org.swizframework.testapp.event { import flash.events.Event; public class MyEvent extends Event { public static const CONTROLLER_ACTION_REQUESTED : String = "controllerActionRequested"; public static const CONTROLLER_ACTION_COMPLETE : String = "controllerActionComplete"; public function MyEvent(type:String) { super(type, true, false); } } }
Finally, the test case itself:
package org.swizframework.testapp.control { import org.swizframework.testapp.MyController; import org.swizframework.testapp.event.MyEvent; import org.flexunit.Assert; import org.flexunit.async.Async; import org.swizframework.core.*; import org.swizframework.utils.test.AutowiredTestCase; public class MyControllerTestCase extends AutowiredTestCase { private var myController : MyController; [Before] /** * Create the object under test, create Swiz configuration, and build the Swiz context * so that it can process the test objects as beans. */ override public function constructSwizContext() : void { myController = new MyController(); swizConfig = new SwizConfig(); swizConfig.eventPackages = "org.swizframework.testapp.event.*"; beanProviders = [new BeanProvider( [myController] )]; super.constructSwizContext(); } [After] public function cleanUp():void { myController = null; } [Test(async)] public function testControllerActionRequested() : void { Assert.assertTrue( "Controller property is already true.", myController.didSomething == false ); Async.handleEvent( this, swiz.dispatcher, MyEvent.CONTROLLER_ACTION_COMPLETE, checkEvent ); swiz.dispatcher.dispatchEvent( new MyEvent( MyEvent.CONTROLLER_ACTION_REQUESTED ) ); } private function checkEvent( event : Event, passThroughData : Object ) : void { Assert.assertTrue( "Controller property was not updated.", myController.didSomething == true ); } } }
We start off setting up an instance of Swiz that the test can use. AutowiredTestCase
has a method marked with [Before]
metadata, so that FlexUnit runs it before each test. Next, create an instance of the class under test (MyController
), then set the event packages on the SwizConfig
. Finally, we place the MyController
instance into a BeanProvider
, so that Swiz will process it as a bean. This way, any Swiz metadata in MyController
is processed.
The test method dispatches a CONTROLLER_ACTION_REQUESTED
event. If all goes well, the event handler in the controller should run, update the property, and then the controller will dispatch the completion event. Running the test produces a passing result.
Note that because Swiz actually processes your test case itself as a bean, you can use Swiz metadata in your test if you want or need to. So injecting a dispatcher, handling an event, or testing custom metadata processors are all possible as well.