    <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
     <channel>
        <title>vaporbase :: Beginners Guide to Rspec on Story Runner</title>
        <link>http://www.vaporbase.com/</link>
        <description>the knowledge base that almost is</description>
        <dc:language>en-us</dc:language> 
        <dc:creator>Vaporbase Admin</dc:creator> 
        <admin:generatorAgent rdf:resource="http://www.xaraya.org" /> 
        <admin:errorReportsTo rdf:resource="mailto:admin@parkerhill.com" /> 
       <sy:updatePeriod>hourly</sy:updatePeriod> 
       <sy:updateFrequency>1</sy:updateFrequency> 
       <docs>http://backend.userland.com/rss</docs>

<!-- show a header for the current publication type -->
        <h2>Postings</h2>


<div class="xar-mod-head"><span class="xar-mod-title">rails</span></div>

<table border="0" cellpadding="1" cellspacing="0">
<tr>
    <td valign="top">
        Browse in :
   </td>
   <td valign="top">

                                    <a href="http://www.vaporbase.com/postings/">All</a>

                 &gt;                     <a href="http://www.vaporbase.com/postings/c36/">subjects</a>

                 &gt;                     <a href="http://www.vaporbase.com/postings/c42/">rails</a>
<br />
</td>
</tr>
</table>






<div class="xar-error">
   <p>
 <strong>Note:</strong> when you create a new publication type,
the articles module will automatically use the templates
<em>user-display-[publicationtype].xd</em>
and <em>user-summary-[publicationtype].xd</em>.
If those templates do not exist when you try to preview or display a new article,
you'll get this warning :-)  Please place your own templates in themes/<em>yourtheme</em>/modules/articles
The templates will get the extension .xt there. </p>
</div>
<div class="xar-norm xar-standard-box-padding">
   <h1><strong>Title:</strong>&nbsp;Beginners Guide to Rspec on Story Runner</h1>
<p><strong>Author:</strong>&nbsp;linoj</p>
<p>
<strong>Date:</strong> September 25, 2007 12:00:48 PM  or Tue, 25 September 2007 12:00:48 </p>
<p><strong>Summary:</strong>&nbsp;I wished for a step by step How To get started with Story Runner, and had to write it myself.</p>
<p><strong>Body:</strong>&nbsp;<p>Story Runner is a nice behavioral integration &quot;test&quot; (er, uh, spec) tool that been incorporated into Rspec and can be used in Ruby on Rail projects. Its not officially released with Rspec but is available in trunk.<br /></p><h4>References:</h4><p>    <a href="http://rspec.rubyforge.org" target="_blank">http://rspec.rubyforge.org</a> - Rspec home</p><p>     <a href="http://rubyforge.org/pipermail/rspec-devel/2007-August/003756.html" target="_blank">http://rubyforge.org/pipermail/rspec-devel/2007-August/003756.html</a>  - David Chelimsky&#39;s announcement </p><p>     <a href="http://evang.eli.st/blog/2007/9/1/user-stories-with-rspec-s-story-runner" target="_blank">http://evang.eli.st/blog/2007/9/1/user-stories-with-rspec-s-story-runner</a> - good tutorial<br /></p><p>     <a href="http://www.nabble.com/Getting-Started-with-Story-Runner-t4485820.html" target="_blank">http://www.nabble.com/Getting-Started-with-Story-Runner-t4485820.html</a> - a helpful discussion thread </p><p>     <a href="http://dannorth.net/whats-in-a-story" target="_blank">http://dannorth.net/whats-in-a-story</a> - explains the structure of a &quot;story&quot;<br /></p><p>     <a href="http://pastie.caboo.se/92472" target="_blank">http://pastie.caboo.se/92472</a>  - a famous pastie (fame is relative  :) </p><p>     <a href="http://dannorth.net/2007/06/introducing-rbehave" target="_blank">http://dannorth.net/2007/06/introducing-rbehave</a> - where it all started </p><h4>Installation </h4><p>Assuming you already have a Rails app going, install Rspec from trunk:</p><pre>$ ruby script/plugin install <a href="svn://rubyforge.org/var/svn/rspec/trunk/rspec" target="_blank">svn://rubyforge.org/var/svn/rspec/trunk/rspec</a><br />$ ruby script/plugin install <a href="svn://rubyforge.org/var/svn/rspec/trunk/rspec_on_rails" target="_blank">svn://rubyforge.org/var/svn/rspec/trunk/rspec_on_rails</a> <br />$ script/generate rspec <br /></pre><p>Create a directory in your web root named &quot;stories/&quot;</p><p>Create a file stories/story_helper.rb with the following:</p><pre>ENV[&quot;RAILS_ENV&quot;] = &quot;test&quot;<br />require File.expand_path(File.dirname(__FILE__) + &quot;/../config/environment&quot;)<br />require &#39;spec/rails/story_adapter&#39; <br /></pre><p>Each story script is an .rb file with the following as its first line:</p><pre>require File.join(File.dirname(__FILE__), &quot;story_helper&quot;) </pre><p>To run a story, just run it directly:</p><pre>$ ruby story/mystory.rb </pre><h4>Thinking</h4><p>From Dan North&#39;s article, the general idea is you spec out a conversation about a feature or requirement. There&#39;s an action title, a text narrative, and then a set of scenarios. The scenario should be described in terms of Givens, Events and Outcomes (given/when/then...) </p><p>The structure is basically like this: </p><pre>Title (one line describing the story)</pre><pre><br />Narrative:</pre><pre>As a [role]</pre><pre>I want [feature]</pre><pre>So that [benefit]</pre><pre><br />Acceptance Criteria: (presented as Scenarios)</pre><pre><br />Scenario 1: Title</pre><pre>Given [context]</pre><pre>  And [some more context]…</pre><pre>When  [event]</pre><pre>Then  [outcome]</pre><pre>  And [another outcome]…</pre><pre><br />Scenario 2: … </pre><h4>A very simple first story</h4><p>The first thing I do when describing a site to someone is go to the home page, and being exploring from there. So, that seems like a legitimate first story to spec out. I create a file stories/anonymous_visitor.rb </p><pre>require File.join(File.dirname(__FILE__), &quot;story_helper&quot;)</pre><pre><br />Story &quot;Anonymous visitor to the site&quot;, %{</pre><pre>  As an anonymous visitor</pre><pre>  I want to visit public pages</pre><pre>}, :type =&gt; RailsStory do</pre><pre>  </pre><pre>  Scenario &quot;Starts at home page and drills down&quot; do</pre><pre>    When &quot;visiting home page&quot; do</pre><pre>      get &quot;/&quot;</pre><pre>    end</pre><pre>    </pre><pre>    Then &quot;user should see home page&quot; do</pre><pre>      response.should render_template(&#39;base/home&#39;)</pre><pre>    end</pre><pre> </pre><pre>    When &quot;he clicks on the About link&quot; do<br />      get &quot;/about&quot;</pre><pre>    end</pre><pre> </pre><pre>    Then &quot;user should see the About page&quot; do </pre><pre>      response.should render_template(&#39;base/about&#39;)</pre><pre>    end </pre><pre>  end</pre><pre>end</pre><p> OK, maybe that&#39;s not so practical (and really should covered in the corresponding controller spec), at least you can make sure your stories are running and good to go. (And after all, Rails&#39; default unit test is simply <em>def test_truth; assert true;  end</em>)</p><p>But then I start building on that, either with more clauses, new scenarios, and/or starting another story file. What about a user logging in? then he should see different content. And when he creates a post, then... And... And, suddenly you&#39;re off and (story) running. </p><h4>Parameterized Scenario Clauses </h4><p>You can reuse scenario clauses, and pass parameters. For example, </p><pre>Scenario &quot;savings account is in credit&quot; do</pre><pre>    Given &quot;my savings account balance is&quot;, 100 do |balance|</pre><pre>      @savings_account = Account.new(balance)</pre><pre>    end</pre><pre>    And &quot;my cash account balance is&quot;, 10 do |balance|</pre><pre>      @cash_account = Account.new(balance)</pre><pre>    end</pre><p>Then the next scenario can reuse the Given clauses with different arguments,</p><pre>Scenario &quot;savings account is overdrawn&quot; do<br />    Given &quot;my savings account balance is&quot;, -20<br />    And &quot;my cash account balance is&quot;, 10</pre><p>Going one step further (as of today Oct  22 &#39;07), Rspec trunk introduces Plain Text Scenarios, which integrates parameters into the text. See <a href="http://blog.davidchelimsky.net/articles/2007/10/21/story-runner-in-plain-english " target="_blank">http://blog.davidchelimsky.net/articles/2007/10/21/story-runner-in-plain-english </a> Doing so, stories become &quot;block-less&quot;-- it encourages you to put all your step clauses into separate Step Matcher methods, which means we can now eliminate all the quote and write truly plain text stories (!!). It&#39;s still experimental, but given the pace this stuff is moving, it may be mainstream by the time you read this!</p><pre>Scenario: savings account is in credit<br />    Given my savings account balance is 100<br />    And my cash account balance is 10</pre> <h4>Working with Stories </h4> <p>I&#39;ve found that writing stories (and their multiple scenarios) helps me think through how things should work (and not work) on the site. </p><p>When I implement a scenario, the &quot;Given&quot; clauses often correspond to models, which leads me to write a model spec, and then implement the model methods.</p><p>And perhaps some actions (especially POSTs that affect models or the session), so I spec their views and controllers. And implement them. </p><p>Usually by then I&#39;ve lost my context so I&#39;ll go back to the current story and see where I&#39;m at in the scenario. </p><p>The last Given is often a GET action (which provides visual context for the  upcoming When clause), so I go ahead and do its view and controller specs.</p><p>The &quot;When&quot; clause is the meat of the scenario. It is a controller action, and its spec gets done next, which often requires drilling down into other models, views, and helper methods.<br /></p><p>Then, the &quot;Then&quot; clauses tend to assert the response in a view. They&#39;ll probably also call model methods to check for results. They get spec&#39;d and implemented, and so on. </p><p>As the stories grow more complex, previously spec&#39;ed scenarios might be stuffed into the Given section of the next story. At that point I write reusable helper methods, which pulls the preconditions together, such as </p> <pre>Given &quot;a user is logged in and has created a post&quot; do<br />  user_is_logged_in_and_has_created_a_post<br />end  <br /></pre> <p>In stories, don&#39;t use mocks, stubs, or fixtures, as you want to exercise the whole stack. Instead I found the <a href="http://thmadb.com/public_svn/plugins/fixture_replacement">fixture_replacement plugin</a>  to be an extremely handy model factory. </p><p>One other thing, the clauses in a scenario may be in a specific order that makes sense from a story point of view, but not necessarily the order I want to implement. But (presently) story-runner just stops when it encounters a  pending (unimplemented) clause. I&#39;ve added this little method to my story_helper.rb</p><pre>def skip_pending(text=&#39;&#39;)<br />  puts &quot;    SKIP PENDING #{text}&quot;<br />end<br /></pre><p> which might be used like this:</p><pre>    And &quot;a welcome message is sent to user&quot; do</pre><pre>      skip_pending &quot;email notifications&quot;</pre><pre>    end</pre><p>&nbsp;</p> <p>&nbsp;</p></p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
        <p>Last modified on Oct 22, 2007 11:48:41 AM by <a href="http://www.vaporbase.com/roles/3">linoj</a></p>
        <p>



<div>
   <p class="xar-cm-note xar-sub">
 Note: Comments are owned by the poster. We are not responsible for their content. </p>
</div>
    <div class="xar-accent-outline xar-cm-comment">
    <div>
         <a name="162"></a>
                <form action="http://www.vaporbase.com/?module=comments&amp;func=reply" method="post" class="xar-cm-actions">
                    <div>
                        <input type="hidden" name="header[modid]" value="151" />
                        <input type="hidden" name="header[itemtype]" value="9" />
                        <input type="hidden" name="header[objectid]" value="142" />
                        <input type="hidden" name="header[pid]" value="162" />
                        <input type="hidden" name="receipt[returnurl][decoded]" value="http://www.vaporbase.com/postings/Beginners_Guide_to_Rspec_on_Story_Runner?&amp;depth=1&amp;order=1&amp;sortby=2&amp;render=flat" />
                        <input type="hidden" name="receipt[returnurl][encoded]" value="http%3A%2F%2Fwww.vaporbase.com%2Fpostings%2FBeginners_Guide_to_Rspec_on_Story_Runner%3F%26amp%3Bdepth%3D1%26amp%3Border%3D1%26amp%3Bsortby%3D2%26amp%3Brender%3Dflat" />
                        <input type="hidden" name="receipt[action]" value="reply" /> 
                        <input type="submit" name="submit" id="submit-reply162" value="Reply" />
                   </div>
               </form>

                <h4>Beginners Guide to Rspec on Story Runner</h4>
<!-- show changelog -->
<!-- end changelog -->
           <span class="xar-sub">
 Posted by:                     Anonymous on                 October 23, 2007 01:56 AM</span>
       </div>
       <div class="xar-accent xar-cm-comment">
                Hey - Thanks for linking to my FixtureReplacement plugin (seems like only a few members in the rspec crowd know about it).  Let me know if there is anything I can do to make it more Story friendly.  I haven't started using the Rspec User Stories (I'll wait until it's in a stable release) - but thanks for your introduction.                <p>
                    <a href="http://www.vaporbase.com/?module=comments&amp;func=display&amp;cid=162" title="Permalink" rel="bookmark">
                       #
                   </a>
               </p>

       </div>

</div>

    <div class="xar-accent-outline xar-cm-comment">
    <div>
         <a name="211"></a>
                <form action="http://www.vaporbase.com/?module=comments&amp;func=reply" method="post" class="xar-cm-actions">
                    <div>
                        <input type="hidden" name="header[modid]" value="151" />
                        <input type="hidden" name="header[itemtype]" value="9" />
                        <input type="hidden" name="header[objectid]" value="142" />
                        <input type="hidden" name="header[pid]" value="211" />
                        <input type="hidden" name="receipt[returnurl][decoded]" value="http://www.vaporbase.com/postings/Beginners_Guide_to_Rspec_on_Story_Runner?&amp;depth=1&amp;order=1&amp;sortby=2&amp;render=flat" />
                        <input type="hidden" name="receipt[returnurl][encoded]" value="http%3A%2F%2Fwww.vaporbase.com%2Fpostings%2FBeginners_Guide_to_Rspec_on_Story_Runner%3F%26amp%3Bdepth%3D1%26amp%3Border%3D1%26amp%3Bsortby%3D2%26amp%3Brender%3Dflat" />
                        <input type="hidden" name="receipt[action]" value="reply" /> 
                        <input type="submit" name="submit" id="submit-reply211" value="Reply" />
                   </div>
               </form>

                <h4>Re: Beginners Guide to Rspec on Story Runner</h4>
<!-- show changelog -->
<!-- end changelog -->
           <span class="xar-sub">
 Posted by:                     Anonymous on                 December 05, 2007 07:56 PM</span>
       </div>
       <div class="xar-accent xar-cm-comment">
                Just to let you know, with FixtureReplacement, version 2, you can now set this in config/environment.rb:

FixtureReplacement.excluded_envrionments = [&quot;production&quot;, &quot;foobar&quot;]

If you try to include the plugin in any other environment, an error will be raised.

The plugin will work in any other environment.  The default is just [&quot;production&quot;]
                <p>
                    <a href="http://www.vaporbase.com/?module=comments&amp;func=display&amp;cid=211" title="Permalink" rel="bookmark">
                       #
                   </a>
               </p>

       </div>

</div>

    <div class="xar-accent-outline xar-cm-comment">
    <div>
         <a name="504"></a>
                <form action="http://www.vaporbase.com/?module=comments&amp;func=reply" method="post" class="xar-cm-actions">
                    <div>
                        <input type="hidden" name="header[modid]" value="151" />
                        <input type="hidden" name="header[itemtype]" value="9" />
                        <input type="hidden" name="header[objectid]" value="142" />
                        <input type="hidden" name="header[pid]" value="504" />
                        <input type="hidden" name="receipt[returnurl][decoded]" value="http://www.vaporbase.com/postings/Beginners_Guide_to_Rspec_on_Story_Runner?&amp;depth=1&amp;order=1&amp;sortby=2&amp;render=flat" />
                        <input type="hidden" name="receipt[returnurl][encoded]" value="http%3A%2F%2Fwww.vaporbase.com%2Fpostings%2FBeginners_Guide_to_Rspec_on_Story_Runner%3F%26amp%3Bdepth%3D1%26amp%3Border%3D1%26amp%3Bsortby%3D2%26amp%3Brender%3Dflat" />
                        <input type="hidden" name="receipt[action]" value="reply" /> 
                        <input type="submit" name="submit" id="submit-reply504" value="Reply" />
                   </div>
               </form>

                <h4>Beginners Guide to Rspec on Story Runner</h4>
<!-- show changelog -->
<!-- end changelog -->
           <span class="xar-sub">
 Posted by:                     Anonymous on                 October 11, 2008 11:03 AM</span>
       </div>
       <div class="xar-accent xar-cm-comment">
                Nice article.                <p>
                    <a href="http://www.vaporbase.com/?module=comments&amp;func=display&amp;cid=504" title="Permalink" rel="bookmark">
                       #
                   </a>
               </p>

       </div>

</div>

<script type="text/javascript" src="modules/base/xartemplates/includes/submitonce.js"></script>
  <h3>Post a new comment</h3> 
  <form action="http://www.vaporbase.com/?module=comments&amp;func=reply" method="post" name="post" id="post" onSubmit="submitonce(this)" id="post"
 >
   <div class="xar-ib-wrapper xar-accent-outline">
<div class="xar-ib-actionpanel xar-accent">
         <span>
 BBCode Actions             : 
          </span>
          <span>
            <!-- New xaraya style link tag <xar:set name="$stylesheet">xarTplAddStyleLink('bbcode', 'bbcode')</xar:set> -->

<span>
    <input type="button" accesskey="z" name="addbbcode18" value=" p " onclick="bbstyle(18)" onmouseover="document.post.helpbox.value='Paragraph: [p]text[/p] (alt+z)'; return true" />
    <input type="button" accesskey="b" name="addbbcode0" value=" b " style="font-weight:bold;" onclick="bbstyle(0)" onmouseover="document.post.helpbox.value='Bold text: [b]text[/b] (alt+b)'; return true" />
    <input type="button" accesskey="i" name="addbbcode2" value=" i " style="font-style:italic;" onclick="bbstyle(2)" onmouseover="document.post.helpbox.value='Italic text: [i]text[/i] (alt+i)'; return true" />
    <input type="button" accesskey="u" name="addbbcode4" value=" u " style="font-style: underline;" onclick="bbstyle(4)" onmouseover="document.post.helpbox.value='Underline text: [u]text[/u] (alt+u)'; return true" />
    <input type="button" accesskey="q" name="addbbcode6" value="Quote" onclick="bbstyle(6)" onmouseover="document.post.helpbox.value='Quote text: [quote]text[/quote] (alt+q)'; return true" />
    <input type="button" accesskey="c" name="addbbcode8" value="Code" onclick="bbstyle(8)" onmouseover="document.post.helpbox.value='Code display: [code=xml]code[/code] (alt+c)'; return true" />
    <input type="button" accesskey="p" name="addbbcode14" value="Img" onclick="bbstyle(14)" onmouseover="document.post.helpbox.value='Insert image: [img]http://image_url[/img] (alt+p)'; return true" />
    <input type="button" accesskey="w" name="addbbcode16" value="URL" style="text-decoration: underline;" onclick="bbstyle(16)" onmouseover="document.post.helpbox.value='Insert URL: [url]http://url[/url] or [url=http://url]URL text[/url] (alt+w)'; return true" />
</span>
<label for="addbbcode20">
 Font color     :
</label>
<select name="addbbcode20" onchange="bbfontstyle('[color=' + this.form.addbbcode20.options[this.form.addbbcode20.selectedIndex].value + ']', '[/color]');this.selectedIndex=0;" onmouseover="document.post.helpbox.value='Font color: [color=red]text[/color] Tip: you can also use color=#FF0000'; return true">
   <option style="color:black; background-color: #FAFAFA" value="#444444" class="xar-bbcode-genmed">
 Default </option>
   <option style="color:darkred; background-color: #FAFAFA" value="darkred" class="xar-bbcode-genmed">
 Dark Red </option>
   <option style="color:red; background-color: #FAFAFA" value="red" class="xar-bbcode-genmed">
 Red </option>
   <option style="color:orange; background-color: #FAFAFA" value="orange" class="xar-bbcode-genmed">
 Orange </option>
   <option style="color:brown; background-color: #FAFAFA" value="brown" class="xar-bbcode-genmed">
 Brown </option>
   <option style="color:yellow; background-color: #FAFAFA" value="yellow" class="xar-bbcode-genmed">
 Yellow </option>
   <option style="color:green; background-color: #FAFAFA" value="green" class="xar-bbcode-genmed">
 Green </option>
   <option style="color:olive; background-color: #FAFAFA" value="olive" class="xar-bbcode-genmed">
 Olive </option>
   <option style="color:cyan; background-color: #FAFAFA" value="cyan" class="xar-bbcode-genmed">
 Cyan </option>
   <option style="color:blue; background-color: #FAFAFA" value="blue" class="xar-bbcode-genmed">
 Blue </option>
   <option style="color:darkblue; background-color: #FAFAFA" value="darkblue" class="xar-bbcode-genmed">
 Dark Blue </option>
   <option style="color:indigo; background-color: #FAFAFA" value="indigo" class="xar-bbcode-genmed">
 Indigo </option>
   <option style="color:violet; background-color: #FAFAFA" value="violet" class="xar-bbcode-genmed">
 Violet </option>
   <option style="color:white; background-color: #FAFAFA" value="white" class="xar-bbcode-genmed">
 White </option>
   <option style="color:black; background-color: #FAFAFA" value="black" class="xar-bbcode-genmed">
 Black </option>
</select>
<label for="addbbcode22">
 Font size     :
</label>
<select name="addbbcode22" onchange="bbfontstyle('[size=' + this.form.addbbcode22.options[this.form.addbbcode22.selectedIndex].value + ']', '[/size]')" onmouseover="document.post.helpbox.value='Font size: [size=x-small]small text[/size]'; return true">
   <option value="7" class="xar-bbcode-genmed">
 Tiny </option>
   <option value="9" class="xar-bbcode-genmed">
 Small </option>
   <option value="12" selected="selected" class="xar-bbcode-genmed">
 Normal </option>
   <option value="18" class="xar-bbcode-genmed">
 Large </option>
   <option value="24" class="xar-bbcode-genmed">
 Huge     </option>
</select>
<a href="javascript:bbstyle(-1)" class="xar-bbcode-genmed" onmouseover="document.post.helpbox.value='Close all open bbCode tags'; return true">Close Tags</a>
<span class="gensmall">
    <input type="text" name="helpbox" size="50" maxlength="100" class="helpline" value="Tip: Styles can be applied quickly to selected text." />
</span>         </span>
       </div>
       <div class="xar-ib-leftpanelshort">
         <p>
 Name :
              Anonymous</p>
         <label for="package-title">
 Title: </label>
            <input class="xar-ib-field" type="text" name="package[title]" id="package-title" value="Beginners Guide to Rspec on Story Runner" tabindex="1" />
         <label for="package-text">
 Comment: </label>
<textarea class="xar-ib-fieldtext" name="package[text]" id="package-text" tabindex="2"></textarea>

          <input type="hidden" name="header[modid]" id="header-modid" value="151" /> 
          <input type="hidden" name="header[objectid]" id="header-objectid" value="142" /> 
          <input type="hidden" name="header[itemtype]" id="header-itemtype" value="9" />
<input type="hidden" name="header[pid]" id="header-pid" value="0" />
          <input type="hidden" name="receipt[returnurl][decoded]" id="receipt-returnurl-decoded" value="http://www.vaporbase.com/postings/Beginners_Guide_to_Rspec_on_Story_Runner?&amp;depth=1&amp;order=1&amp;sortby=2&amp;render=flat" />
          <!--<input type="hidden" name="receipt[returnurl][encoded]" id="receipt-returnurl-encoded" value="#$receipt['returnurl']['encoded']#" />-->
          <input type="hidden" name="receipt[action]" id="receipt-action" /> 
          <input type="submit" id="receipt-action-preview" onclick="document.getElementById('receipt-action').value='preview'" value="Preview" /> 
          <input type="submit" id="receipt-action-submit" onclick="document.getElementById('receipt-action').value='submit'" value="Submit" />
       </div>
</div>
 </form>
</p>
        <p></p>
        <p><br/>
<b>Keywords :</b>
<div style="margin-left: 1em; margin-right: 1em; text-align:left;">
    <li><a href="http://www.vaporbase.com/keywords/rspec/">rspec</a></li>
    <li><a href="http://www.vaporbase.com/keywords/story runner/">story runner</a></li>
</div>
<br/>

</p>
</div>
   </channel>
</rss>
