<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>OnRails.org: Sweet way to write Flex Unit tests for Rails</title>
    <link>http://onrails.org/articles/2007/11/05/sweet-way-to-write-flex-unit-tests-for-rails</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Ruby On Rails and related matters.</description>
    <item>
      <title>Sweet way to write Flex Unit tests for Rails</title>
      <description>&lt;p&gt;Using ActiveResources from Flex? Using FlexUnit? Here is a nice way to write your tests.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;div class="codetitle"&gt;Example Test Case&lt;/div&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;package&lt;/span&gt; &lt;span class="ident"&gt;tests&lt;/span&gt;
&lt;span class="punct"&gt;{&lt;/span&gt;
    &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;flexunit&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;framework&lt;/span&gt;&lt;span class="punct"&gt;.*;&lt;/span&gt;    
    &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;mx&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rpc&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;AsyncToken&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
    &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;mx&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rpc&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;events&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;ResultEvent&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
    &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;resources&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;Raffles&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;

    &lt;span class="ident"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;TestRaffles&lt;/span&gt; &lt;span class="ident"&gt;extends&lt;/span&gt; &lt;span class="constant"&gt;BaseTestCase&lt;/span&gt;
    &lt;span class="punct"&gt;{&lt;/span&gt;    
        &lt;span class="ident"&gt;private&lt;/span&gt; &lt;span class="ident"&gt;var&lt;/span&gt; &lt;span class="ident"&gt;raffles&lt;/span&gt;&lt;span class="symbol"&gt;:Raffles&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;        
        &lt;span class="ident"&gt;public&lt;/span&gt; &lt;span class="ident"&gt;function&lt;/span&gt; &lt;span class="constant"&gt;TestRaffles&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="constant"&gt;String&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;null&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="punct"&gt;{&lt;/span&gt;
            &lt;span class="keyword"&gt;super&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;);&lt;/span&gt;
            &lt;span class="ident"&gt;fixtures&lt;/span&gt;&lt;span class="punct"&gt;([&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;raffles&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;]);&lt;/span&gt;
             &lt;span class="ident"&gt;raffles&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;new&lt;/span&gt; &lt;span class="constant"&gt;Raffles&lt;/span&gt;&lt;span class="punct"&gt;();&lt;/span&gt;
        &lt;span class="punct"&gt;}&lt;/span&gt;            
        &lt;span class="ident"&gt;public&lt;/span&gt; &lt;span class="ident"&gt;function&lt;/span&gt; &lt;span class="ident"&gt;testRemoteFindRaffle&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;&lt;span class="symbol"&gt;:void&lt;/span&gt;
        &lt;span class="punct"&gt;{&lt;/span&gt;
            &lt;span class="ident"&gt;assertRemote&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;raffles&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;show&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;));&lt;/span&gt;
        &lt;span class="punct"&gt;}&lt;/span&gt;
        &lt;span class="ident"&gt;public&lt;/span&gt; &lt;span class="ident"&gt;function&lt;/span&gt; &lt;span class="ident"&gt;assertRemote_testRemoteFindRaffle&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;data&lt;/span&gt;&lt;span class="symbol"&gt;:Object&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;span class="symbol"&gt;:void&lt;/span&gt;
        &lt;span class="punct"&gt;{&lt;/span&gt;
            &lt;span class="constant"&gt;Assert&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;assertTrue&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Raffle show successfully called&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="ident"&gt;data&lt;/span&gt; &lt;span class="ident"&gt;is&lt;/span&gt; &lt;span class="constant"&gt;ResultEvent&lt;/span&gt;&lt;span class="punct"&gt;);&lt;/span&gt;  
            &lt;span class="ident"&gt;assertEquals&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;MyString&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="ident"&gt;data&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;result&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;);&lt;/span&gt;
        &lt;span class="punct"&gt;}&lt;/span&gt;        

    &lt;span class="punct"&gt;}&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Note this code is not yet a plugin and is using code you can find here: &lt;a href="http://code.google.com/p/flexonrails/source"&gt;http://code.google.com/p/flexonrails/source&lt;/a&gt;. I was starting to use it on multiple projects so I thought it was to time find a home for it. Also it is using the org.onrails.rails.ActiveResourceClient Flex class. I would recommend that you use &lt;a href="http://code.google.com/p/as3-active-resource/"&gt;Alex MacCaw&amp;#8217;s ActvieResrouce for Actionscript&lt;/a&gt;. I still need to talk with Alex and integrate this fixture loading code with his code.&lt;/p&gt;


	&lt;p&gt;The BaseTestCase Flex class is an extended TestCase that provides support for fixtures. Now in your constructor you can define which fixtures you want to reload between each test. Only tests methods starting with &amp;#8220;testRemote&amp;#8221; will trigger refreshing the fixtures. As you know, when using &lt;span class="caps"&gt;AMF&lt;/span&gt; or HttpService remote invocations are asynchronous and you cannot test the result of a remote call in the same method than where the call is made from. That&amp;#8217;s why I added the assertRemote method which takes an AsyncToken as parameters. This will automatically invoke a method whos name starts with assertRemote_ followed by the test method name. This simplifies greatly writing asynchronous tests. FlexUnit provides the &lt;em&gt;addAsync&lt;/em&gt; method, we just add the convenience assertRemote function to setup all the callbacks.&lt;/p&gt;


	&lt;p&gt;To make this work for you Flex with Rails project. You need to fixtures_controller.rb to your controllers and setup the following routes:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;RAILS_ENV&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;resources&lt;/span&gt; &lt;span class="symbol"&gt;:fixtures&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:new&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="symbol"&gt;:test_results&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:post&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
    &lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;crossdomain&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/crossdomain.xml&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:controller&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;fixtures&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:action&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;crossdomain&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;You need to extend your Flex TestCase from tests.BaseTestCase.&lt;/p&gt;


	&lt;p&gt;Enjoy,
Daniel.&lt;/p&gt;</description>
      <pubDate>Mon, 05 Nov 2007 15:11:56 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:1b2986d1-3683-4b3a-8491-197e2ac794b3</guid>
      <author>Daniel Wanja</author>
      <link>http://onrails.org/articles/2007/11/05/sweet-way-to-write-flex-unit-tests-for-rails</link>
      <category>Flex</category>
      <category>Ruby On Rails</category>
    </item>
  </channel>
</rss>
