[rspec-users] New RSpec methods to Object proposal: should_all and should_none

Matt Wynne matt at mattwynne.net
Wed Dec 9 15:08:50 EST 2009


On 9 Dec 2009, at 19:16, Wincent Colaiuta wrote:

> El 09/12/2009, a las 19:15, David Chelimsky escribió:
>
>> On Wed, Dec 9, 2009 at 11:55 AM, Pat Maddox <mailinglists at patmaddox.com 
>> > wrote:
>>> [@admin, @allowed_user].should all(be_allowed_to_visit(url))
>>> [@admin, @allowed_user].should all_be_allowed_to_visit(url)
>
>>> On Dec 9, 2009, at 5:27 AM, David Chelimsky wrote:
>>>
>>> On Wed, Dec 9, 2009 at 5:41 AM, Rodrigo Rosenfeld Rosas
>>> <lbocseg at yahoo.com.br> wrote:
>>>>
>>>> I was thinking that it would be great to add 2 additional methods  
>>>> to
>>>> Object: should_all and should_none.
>>>>
>>>> The idea is that we would be able to write tests like:
>>>>
>>>> [@admin, @allowed_user].should_all be_allowed_to_visit(url)
>>>>
>>>> [@unprivileged, @non_welcome].should_none be_allowed_to_visit(url)
>>>>
>>>> Implementation is trivial, but I think that tests would become much
>>>> cleaner than:
>>>>
>>>> [@admin, @allowed_user].each{|u| u.should be_allowed_to_visit(url)}
>>>>
>>>> Any thoughts on that?
>>>
>>> How about:
>>> each_of(@admin, @allowed_user).should be_allowed_to_visit(url)
>>> none_of(@admin, @allowed_user).should be_allowed_to_visit(url)
>>> This gets the cleanliness without adding to Object.
>
> I'm puzzled as to why people are so focussed on making specs read  
> like plain text English when they are still developer-facing Ruby  
> code.
>
> Especially suprised in this case of wanting to avoid the "each +  
> block" enumeration idiom, which is about as "bread and butter" Ruby  
> as you can get, readable to anybody who's ever read the first  
> chapter of a Ruby book.

+1

Personally I'd use Cucumber for testing this sort of behaviour, but if  
I was using RSpec for some reason, I'd be inclined to use macros so I  
got a separate failing example for each type of user:

url = 'http://some/url'
[:admin, :allowed_user].each do |user_type|
   it "should allow an #{user_type} to visit #{url}" do
     user = instance_variable_get("@#{user_type}.to_sym)
     user.should be_allowed_to_visit(url)
   end
end

Either that or just simply a separate nested describe block for each  
type of user:

describe "an admin user" do
   before(:each) do
      @user = Factory(:user, :admin => true)
   end

   it "should be allowed to access the URL"
end

etc.


cheers,
Matt

http://mattwynne.net
+447974 430184



More information about the rspec-users mailing list