On Sun, Apr 19, 2009 at 8:50 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:59 AM >> To: rspec-users >> Subject: Re: [rspec-users] Custom Example Groups >> >> 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)} >> > > Thanks. I'm not sure I want to actually do a request though, because it's > really only testing the routes in that example. > > I know there are already ways of spec'ing the routes of course, but I'm > trying to learn more about customizing RSpec. And I really like this syntax. > > So as a more expanded version, let's say this: > > describe '/posts' do > with_method :get do > it { should be_accepted } > it { should map_to_action 'index' } > end > > with_method :post do > it { should be_accepted } > it { should map_to_action 'create' } > end > > with_method :put do > it { should_not be_accepted } > end > > with_method :delete do > it { should_not be_accepted } > end > end
So you probably want to wrap asset_recognizes and assert_generates in custom matchers at that point: def with_method(verb) do |verb| subject { {:path => description_args.first, :method => verb } } yield end Spec::Matchers.define :be_accepted do match do |path_and_method| wrap_expectation do assert_recognizes path_and_method end end end That's all off the top of my head, so it might not work exactly as/is - but that's the basic idea. Cheers, David > > Thanks, > Brandon > >> 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 > > _______________________________________________ > 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