Thanks, I'll give the snippet a try.

My intent is not to pass the hash to the post directly, but to fill form fields using webrat. Just i want a resusable step for filling out the form with different values. Similarly I'll use the hash parser for checking row cells in a list view, etc


On Aug 8, 2008, at 1:43 PM, Ben Mabey wrote:

Jonathan Linowes wrote:
Hi,
Anyone have code you could share that lets you pass a hash in plain text stories,
for example

Then I fill out form with name: Jon, email: [EMAIL PROTECTED], age: 9

passes in a hash { 'name' => 'Jon', 'emal' => '[EMAIL PROTECTED]', 'age' => '9' }


_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users
Jonathan,
You can do this, and I have done it in the past, but I wouldn't recommend it. Their are a couple of reasons why I would discourage it. The first is that by just posting a hash to the form's URL (like you would do in a controller spec) you are not verifying the existence of the form fields and thereby skipping the view layer of the stack. You can get around this by also checking the markup for the form fields like you would in a view spec. However, doing this becomes very tedious. A much better solution exists and that is webrat. Webrat offers a very nice interface that ends up verifying the existence of the form fields and doing the post for you. If you haven't looked into webrat then I would highly recommend it.[1]

The other disadvantage of what you are doing is that you might be placing too much information in your stories. The danger of this is that you might end up with ugly stories with a lot of noise that end up drowning out the real 'signal' of the story. Additionally, every time you add a field to the form you will have to change the story. See my post about the different styles of writing styles to see an example of how you might rewrite it. [2]

That said, I don't know your exact situation and what you are trying to do may very well be the best approach to it. So, the answer to your real question would be something like:


# Pass the params as such: ISBN: '0967539854' and comment: 'I love this book' and rating: '4'
 # this matcher will post to the resourcese default create action
When "$actor submits $a_or_an $resource with $attributes" do | actor, a_or_an, resource, attributes| post_via_redirect "/#{resource.downcase.pluralize}", {resource.downcase => attributes.to_hash_from_story}
 end

class String
 # Coverts a string found in the steps into a hash.  Example:
 # ISBN: '0967539854' and comment: 'I love this book' and rating: '4'
# => {"rating"=>"4", "isbn"=>"0967539854", "comment"=>"I love this book"}
 def to_hash_from_story
   self.split(/, and |, /).inject({}){ |hash_so_far, key_value|
key, value = key_value.split(":").map{ |v| v.strip.gsub(" ","_")} hash_so_far.merge (key.downcase => value.gsub("'",""))
                                           }
 end
end

To reiterate, I really do not like the pattern above. I started out doing stories like that ran into many problems with it. In short I think step reuse is overrated.

I hope that helps,
Ben


[1] http://www.benmabey.com/2008/02/04/rspec-plain-text-stories- webrat-chunky-bacon/ [2] http://www.benmabey.com/2008/05/19/imperative-vs-declarative- scenarios-in-user-stories/

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to