On 2008-11-12, at 16:38, Ben Mabey wrote:
Nick Hoffman wrote:
After digesting that post again, especially the contents of #self.included , I noticed that one could alternatively do this:

module AssignMacro
 def self.extended(receiver)
   receiver.extend ExampleGroupMethods
   receiver.send :include, ExampleMethods
 end
end

describe UserPhotosController do
 describe "GET 'users/1/photos/2'" do
   extend AssignMacro
   # ...
 end
end

Is one approach more preferable? Or should one do this so that both "include AssignMacro" and "extend AssignMacro" give the same, desired, result?:

module AssignMacro
 def self.included(receiver)
   receiver.extend ExampleGroupMethods
   receiver.send :include, ExampleMethods
 end

 class << self
   alias_method :extended, :included
 end
end

Thanks for your input, guys.
-Nick

Some people would say that using the included or extended module hooks like that are evil.[1] That said it is a very common ruby idiom even if it is bad. If you are going to use the evil idiom then I would suggest using include and not extend since it is the idiom. :)

Another way to do it that wouldn't take advantage of the evil hooks would be:

describe UserPhotosController do
describe "GET 'users/1/photos/2'" do
  extend AssignMacro::ExampleGroupMethods
  include AssignMacro::ExampleMethods
  # ...
end

Of course that is somewhat annoying to type everywhere. So perhaps you could add another example group method that would mix in macors.. likes so:

describe UserPhotosController do
describe "GET 'users/1/photos/2'" do
  use_macro AssignMacro
  # ...
end
end

The 'use_maco' would be a module that you mix in onto all rspec's example group methods that would simply include and extend the given module's ExampleMethods and ExampleGroupMethods modules respectively.

The 'use_macro' is probably more clear than the hooks. Just a thought.

-Ben


1. http://olabini.com/blog/2008/09/evil-hook-methods/

The "evil hook methods" article explained exactly how I was feeling. Everyone's different, but I feel dirty extending the receiver in #included , and vice versa. I've decided to go along with your first suggested alternative:

## spec/spec_helper.rb
# ..snip..
Spec::Runner.configure do |config|
  # ..snip..
config.extend AuthSpecHelpers::ExampleGroupMethods, :type => :controller config.include AuthSpecHelpers::ExampleMethods, :type => :controller
end

Thanks again for taking the time to explain all of this, Ben. I really learned a lot. Cheers,
Nick
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to