On Sun, Apr 19, 2009 at 9:32 AM, Brandon Olivares <programmer2...@gmail.com> wrote: > > >> -----Original Message----- >> From: rspec-users-boun...@rubyforge.org [mailto:rspec-users- >> boun...@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.mad...@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 >> > <programmer2...@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@rubyforge.org >> >> http://rubyforge.org/mailman/listinfo/rspec-users >> >> >> > _______________________________________________ >> > 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 > > _______________________________________________ > 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