<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>Jason's Weblog: Easier testing of forms: form_test_helper</title>
  <id>tag:www.jasongarber.com,2005:Typo</id>
  <generator uri="http://www.typosphere.org" version="4.0">Typo</generator>
  <link href="http://www.jasongarber.com/xml/atom/article/44/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="http://www.jasongarber.com/articles/2006/10/24/easier-testing-of-forms-form_test_helper" rel="alternate" type="text/html"/>
  <updated>2006-10-31T11:26:49-08:00</updated>
  <entry>
    <author>
      <name>Jason Garber</name>
    </author>
    <id>urn:uuid:e51a761d-5582-4569-86cd-17742928af59</id>
    <published>2006-10-24T16:59:00-07:00</published>
    <updated>2006-10-31T11:26:49-08:00</updated>
    <title type="html">Easier testing of forms: form_test_helper</title>
    <link href="http://www.jasongarber.com/articles/2006/10/24/easier-testing-of-forms-form_test_helper" rel="alternate" type="text/html"/>
    <category term="rails" scheme="http://www.jasongarber.com/articles/category/rails" label="Rails"/>
    <summary type="html">With the &lt;a href="http://code.google.com/p/form-test-helper/"&gt;form_test_helper&lt;/a&gt; Rails plugin, your functional and integration tests can work more like the browser.  No longer do you need to feed params to an action:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;post&lt;/span&gt; &lt;span class="symbol"&gt;:create&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:name&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;Pickaxe&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:category&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:out_of_print&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;
&lt;span class="ident"&gt;assert_response&lt;/span&gt; &lt;span class="symbol"&gt;:success&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
... and then watch it silently break when you change your form but forget to change the test.  With  &lt;a href="http://code.google.com/p/form-test-helper/"&gt;form_test_helper&lt;/a&gt;, you just call up the form, change the fields you want, and submit it.
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;get&lt;/span&gt; &lt;span class="symbol"&gt;:new&lt;/span&gt;
&lt;span class="ident"&gt;submit_form&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;form&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="ident"&gt;form&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&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="string"&gt;Pickaxe&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;form&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;category&lt;/span&gt;&lt;span class="punct"&gt;']&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;Programming&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;form&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;out_of_print&lt;/span&gt;&lt;span class="punct"&gt;'].&lt;/span&gt;&lt;span class="ident"&gt;uncheck&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="ident"&gt;assert_response&lt;/span&gt; &lt;span class="symbol"&gt;:success&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  
...or simply:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;submit_form&lt;/span&gt; &lt;span class="symbol"&gt;:name&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;Pickaxe&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:category&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;Programming&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:out_of_print&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;This is advantageous because it uses the action  and method of the form, verifies that the form and the fields you specify are present and not misspelled, and it preserves any hidden or default values that may be in the form, like in &lt;a href="http://code.google.com/p/form-spam-protection/"&gt;form_spam_protection&lt;/a&gt;.&lt;/p&gt;


	&lt;h3&gt;Features&lt;/h3&gt;


	&lt;ul&gt;
	&lt;li&gt;Can select_form by dom_id or url&amp;#8212;or call without arguments if there&amp;#8217;s only one form&lt;/li&gt;
		&lt;li&gt;Specifying a field name that doesn&amp;#8217;t exist raises an exception&lt;/li&gt;
		&lt;li&gt;Fields that are selects (dropdowns) won&amp;#8217;t let you set a value that&amp;#8217;s not in its options&lt;/li&gt;
		&lt;li&gt;Selects can set using the option label or the option value&lt;/li&gt;
		&lt;li&gt;Inspect/verify the options for selects and radio buttons&lt;/li&gt;
		&lt;li&gt;Works with RESTful links and forms &amp;#8211; :method =&amp;gt; :put, :delete&amp;#8230;&lt;/li&gt;
		&lt;li&gt;Checks for the presence of a submit button when you submit the form&lt;/li&gt;
		&lt;li&gt;Works in functional and integration tests&lt;/li&gt;
		&lt;li&gt;You can pass #submit a hash and it will update the form accordingly.  Submitting a form with new values can be as simple as: &lt;code&gt;select_form.submit {:username =&amp;gt; 'bob', :password =&amp;gt; 'opensesame'}&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Assert presence of and follow links&lt;/li&gt;
		&lt;li&gt;See tests for more goodies!&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h3&gt;Installing&lt;/h3&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;./script/plugin install -x http://form-test-helper.googlecode.com/svn/form_test_helper/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Requires &lt;a href="http://wiki.rubyonrails.com/rails/pages/EdgeRails"&gt;EdgeRails&lt;/a&gt; or the &lt;a href="http://www.agilewebdevelopment.com/plugins/assert_select"&gt;assert_select&lt;/a&gt; plugin&lt;/p&gt;


	&lt;h3&gt;Bugs/Suggestions&lt;/h3&gt;


	&lt;p&gt;You can e-mail me with my first and last initials at this domain or post &amp;#8220;issues&amp;#8221; on &lt;a href="http://code.google.com/p/form-test-helper"&gt;http://code.google.com/p/form-test-helper&lt;/a&gt;&lt;/p&gt;</summary>
    <content type="html">With the &lt;a href="http://code.google.com/p/form-test-helper/"&gt;form_test_helper&lt;/a&gt; Rails plugin, your functional and integration tests can work more like the browser.  No longer do you need to feed params to an action:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;post&lt;/span&gt; &lt;span class="symbol"&gt;:create&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:name&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;Pickaxe&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:category&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:out_of_print&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;
&lt;span class="ident"&gt;assert_response&lt;/span&gt; &lt;span class="symbol"&gt;:success&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
... and then watch it silently break when you change your form but forget to change the test.  With  &lt;a href="http://code.google.com/p/form-test-helper/"&gt;form_test_helper&lt;/a&gt;, you just call up the form, change the fields you want, and submit it.
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;get&lt;/span&gt; &lt;span class="symbol"&gt;:new&lt;/span&gt;
&lt;span class="ident"&gt;submit_form&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;form&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="ident"&gt;form&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&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="string"&gt;Pickaxe&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;form&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;category&lt;/span&gt;&lt;span class="punct"&gt;']&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;Programming&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;form&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;out_of_print&lt;/span&gt;&lt;span class="punct"&gt;'].&lt;/span&gt;&lt;span class="ident"&gt;uncheck&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="ident"&gt;assert_response&lt;/span&gt; &lt;span class="symbol"&gt;:success&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  
...or simply:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;submit_form&lt;/span&gt; &lt;span class="symbol"&gt;:name&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;Pickaxe&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:category&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;Programming&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:out_of_print&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;This is advantageous because it uses the action  and method of the form, verifies that the form and the fields you specify are present and not misspelled, and it preserves any hidden or default values that may be in the form, like in &lt;a href="http://code.google.com/p/form-spam-protection/"&gt;form_spam_protection&lt;/a&gt;.&lt;/p&gt;


	&lt;h3&gt;Features&lt;/h3&gt;


	&lt;ul&gt;
	&lt;li&gt;Can select_form by dom_id or url&amp;#8212;or call without arguments if there&amp;#8217;s only one form&lt;/li&gt;
		&lt;li&gt;Specifying a field name that doesn&amp;#8217;t exist raises an exception&lt;/li&gt;
		&lt;li&gt;Fields that are selects (dropdowns) won&amp;#8217;t let you set a value that&amp;#8217;s not in its options&lt;/li&gt;
		&lt;li&gt;Selects can set using the option label or the option value&lt;/li&gt;
		&lt;li&gt;Inspect/verify the options for selects and radio buttons&lt;/li&gt;
		&lt;li&gt;Works with RESTful links and forms &amp;#8211; :method =&amp;gt; :put, :delete&amp;#8230;&lt;/li&gt;
		&lt;li&gt;Checks for the presence of a submit button when you submit the form&lt;/li&gt;
		&lt;li&gt;Works in functional and integration tests&lt;/li&gt;
		&lt;li&gt;You can pass #submit a hash and it will update the form accordingly.  Submitting a form with new values can be as simple as: &lt;code&gt;select_form.submit {:username =&amp;gt; 'bob', :password =&amp;gt; 'opensesame'}&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Assert presence of and follow links&lt;/li&gt;
		&lt;li&gt;See tests for more goodies!&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h3&gt;Installing&lt;/h3&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;./script/plugin install -x http://form-test-helper.googlecode.com/svn/form_test_helper/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Requires &lt;a href="http://wiki.rubyonrails.com/rails/pages/EdgeRails"&gt;EdgeRails&lt;/a&gt; or the &lt;a href="http://www.agilewebdevelopment.com/plugins/assert_select"&gt;assert_select&lt;/a&gt; plugin&lt;/p&gt;


	&lt;h3&gt;Bugs/Suggestions&lt;/h3&gt;


	&lt;p&gt;You can e-mail me with my first and last initials at this domain or post &amp;#8220;issues&amp;#8221; on &lt;a href="http://code.google.com/p/form-test-helper"&gt;http://code.google.com/p/form-test-helper&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
</feed>
