diff --git a/lib/rspec/matchers/matcher.rb b/lib/rspec/matchers/matcher.rb index afeb691a3..d597cb7c9 100644 --- a/lib/rspec/matchers/matcher.rb +++ b/lib/rspec/matchers/matcher.rb @@ -97,11 +97,9 @@ def diffable # See RSpec::Matchers def chain(method, &block) - self.class.class_eval do - define_method method do |*args| - block.call(*args) - self - end + define_method method do |*args| + block.call(*args) + self end end diff --git a/spec/rspec/matchers/matcher_spec.rb b/spec/rspec/matchers/matcher_spec.rb index 2fa95b02c..14fda407b 100644 --- a/spec/rspec/matchers/matcher_spec.rb +++ b/spec/rspec/matchers/matcher_spec.rb @@ -334,6 +334,14 @@ def assert_equal(a,b) matcher.expecting('value').matches?('other value').should be_false end + it "prevents name collisions on chainable methods from different matchers" do + m1 = RSpec::Matchers::Matcher.new(:m1) { chain(:foo) { raise "foo in m1" } } + m2 = RSpec::Matchers::Matcher.new(:m2) { chain(:foo) { raise "foo in m2" } } + + expect { m1.foo }.to raise_error("foo in m1") + expect { m2.foo }.to raise_error("foo in m2") + end + context "defined using the dsl" do def a_method_in_the_example "method defined in the example"