[rspec-users] passing a hash in stories

Jonathan Linowes jonathan at parkerhill.com
Fri Aug 8 17:36:57 EDT 2008


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: jon at mail.com, age: 9
>>
>> passes in a hash { 'name' => 'Jon', 'emal' => 'jon at mail.com',  
>> 'age' => '9' }
>>
>>
>> _______________________________________________
>> rspec-users mailing list
>> rspec-users at 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 at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users



More information about the rspec-users mailing list