[rspec-users] Custom Example Groups

David Chelimsky dchelimsky at gmail.com
Sun Apr 19 08:58:37 EDT 2009


On Sun, Apr 19, 2009 at 9:32 AM, Brandon Olivares
<programmer2188 at gmail.com> wrote:
>
>
>> -----Original Message-----
>> From: rspec-users-bounces at rubyforge.org [mailto:rspec-users-
>> bounces at rubyforge.org] On Behalf Of David Chelimsky
>> Sent: Sunday, April 19, 2009 8:05 AM
>> To: rspec-users
>> Subject: Re: [rspec-users] Custom Example Groups
>>
>> On Sun, Apr 19, 2009 at 5:10 AM, Pat Maddox <pat.maddox at gmail.com>
>> wrote:
>> > Check out http://gist.github.com/97967 - top one is a custom example
>> > group, and bottom one is accessing an example's instance var from
>> > within a matcher.
>>
>> I forked this and modified it a bit: http://gist.github.com/98041
>>
>> This shows how to set up class methods that you can access outside
>> examples (inside groups) and instance methods you can access inside
>> the examples.
>>
>
> Thank you. That also helps a lot.
>
>> Also - just a word of caution - even though you *can* access instance
>> variables in matchers, it seems very brittle to me to attach matchers
>> to specifically named instance variables like that.
>>
>> Can you show us what you're trying to do? Perhaps there are less
>> brittle alternatives.
>>
>
> Well, as an example, let's say I would want to be able to do something like
> this, where the matcher is aware of its context:
>
> describe '/posts', :type => :route do
>  with_method :get do
>    it { should be_accepted }
>    it { should map_to_action 'index' }
>  end
> end
>
> Well that with_method would either be a class method like that or use
> context somehow.
>
> But either way, in that example, I'd like be_accepted to know it's testing
> the /posts route, for method GET.

You should be able to get what you're after like this:

A class method:

class MyGroup < Spec::ExampleGroup
  class << self
    def with_method(verb)
      subject { send(verb, description_args.first) }
      yield
    end
  end
end

This is a bit tricky, but basically description_args is an array of
all the arguments sent to describe() (including in nested groups). The
first one, in your example above, is '/posts'. So the result of this
code is that when you call with_method(:get), the subject becomes the
result of calling get '/posts'.

Give that a shot and let us know if it works.

Also - you really don't need custom groups for this sort of thing,
because you can define with_method in a module and extend the
configuration w/ that module:

  module WithMethod
    def with_method(verb)
      subject { send(verb, description_args.first) }
      yield
    end
  end

  Spec::Runner.configure {|c| c.extend(WithMethod)}

Cheers,
David

>
> Thanks,
> Brandon
>
>> Cheers,
>> David
>>
>> >
>> > Pat
>> >
>> > On Sat, Apr 18, 2009 at 11:31 PM, Brandon Olivares
>> > <programmer2188 at gmail.com> wrote:
>> >> Hi,
>> >>
>> >> I want to build a custom example group, but there really aren't any
>> examples
>> >> anywhere for how to do so. The new chapter in The RSpec Book talks
>> about it,
>> >> but doesn't actually show an example, only how to register it.
>> >>
>> >> Looking at rspec-rails, I can see a pattern, but I don't know if
>> that's
>> >> specific to rspec-rails, or if it is what should be done. In rspec-
>> rails, it
>> >> has:
>> >>
>> >> Class << self
>> >>
>> >> Within the class, and all the methods are within that.
>> >>
>> >> So, are there any examples anywhere for how to write an example
>> group?
>> >>
>> >> Also, if I set an instance variable within the example group, will
>> the
>> >> matchers specific to that group be able to access it? That'll
>> simplify my
>> >> design a bit.
>> >>
>> >> Thanks,
>> >> Brandon
>> >>
>> >> _______________________________________________
>> >> rspec-users mailing list
>> >> rspec-users at rubyforge.org
>> >> http://rubyforge.org/mailman/listinfo/rspec-users
>> >>
>> > _______________________________________________
>> > rspec-users mailing list
>> > rspec-users at rubyforge.org
>> > http://rubyforge.org/mailman/listinfo/rspec-users
>> >
>> _______________________________________________
>> rspec-users mailing list
>> rspec-users at rubyforge.org
>> http://rubyforge.org/mailman/listinfo/rspec-users
>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>


More information about the rspec-users mailing list