(, , ), , describe/context, rspec , ( RSpec::Core::ExampleGroup), module_eval .
describe "foo" do
puts "#{self}; #{self.superclass}"
describe "behaviour 1" do
puts "#{self}; #{self.superclass}"
context "with x" do
puts "#{self}; #{self.superclass}"
end
end
end
#<Class:0x007fb772bfbc70>; RSpec::Core::ExampleGroup
#<Class:0x007fb772bfb180>; #<Class:0x007fb772bfbc70>
#<Class:0x007fb772bfa5f0>; #<Class:0x007fb772bfb180>
it rspec Example self ( ). rspec , , .
repetitively_describe describe, , example_group_block.call item, . proc , , , , self, , it , , repetitively_describe ( , , ). , repetitively_describe.
, , , example_group_block, self.
module RepetitivelyDescribe
def repetitively_describe(*args, &example_group_block)
options = args.extract_options!
options.delete(:for).each do |item|
item_args = args.collect(&:dup) + [options.dup]
item_args[0] << " [#{item}]"
describe(*item_args) do
class_exec(item, &example_group_block)
end
end
end
end
describe('foo') do
repetitively_describe "Query API", :for => %w( v1 v2 ) do |version|
it "responds with JSON"
end
end.descendant_filtered_examples.collect(&:full_description)
["foo Query API [v1] responds with JSON", "foo Query API [v2] responds with JSON"] ["foo responds with JSON", "foo responds with JSON"] .