[rspec-users] Evaluating shared example customisation block before shared block

Ashley Moran ashley.moran at patchspace.co.uk
Fri Jul 30 06:13:13 EDT 2010


Hi

I finally looked into why this is not currently possibly in RSpec 2 (beta 19):

  shared_examples_for "Etymology" do
    describe "The etymology of foo" do
      it "is followed by #{after_foo}" do
        # ...
      end
    end
  end

  describe "foo", focus: true do
    it_should_behave_like "Etymology" do
      def self.after_foo
        "bar"
      end
    end
  end

It's because of the current implementation of ExampleGroup.define_shared_group_method, which evaluates the shared example block before the customisation block:

   shared_group = describe("#{report_label} \#{name}", &shared_block)
   shared_group.class_eval(&customization_block) if customization_block

(This is behaviour I found surprising.)

However, with a little more metaprogramming jiggery-pokery, you can have them evaluated in the other order:

  module RSpec
    module Core
      class ExampleGroup
        # ...

        def self.define_shared_group_method(new_name, report_label=nil)
          report_label = "it should behave like" unless report_label
          module_eval(<<-END_RUBY, __FILE__, __LINE__)
            def self.#{new_name}(name, &customization_block)
              shared_block = world.shared_example_groups[name]
              raise "Could not find shared example group named \#{name.inspect}" unless shared_block

              compound_block = lambda do |*args|
                module_eval &customization_block if customization_block
                module_eval &shared_block
              end

              shared_group = describe("#{report_label} \#{name}", &compound_block)
              shared_group
            end
          END_RUBY
        end
        
        # ...
      end
    end
  end

Would this be a useful improvement to RSpec 2?  Any opinions on the order of the block evaluation for shared examples?

Cheers
Ash

-- 
http://www.patchspace.co.uk/
http://www.linkedin.com/in/ashleymoran



More information about the rspec-users mailing list