Browse files

Fix confusing error message in `be_within`

This is a patch for the following issue:


It is possible to have duck typing for numerical operations, but the minus
sign is often used for other operations as well such as the set
difference that Array#- performs. In that case, even if it does not fail
on the :- method, it will probably fail on the subsequent :abs and :<=
  • Loading branch information...
1 parent 5626043 commit 675115da39029770a353092194169e1119d7444e @zhangsu zhangsu committed May 17, 2012
Showing with 7 additions and 0 deletions.
  1. +3 −0 lib/rspec/matchers/built_in/be_within.rb
  2. +4 −0 spec/rspec/matchers/be_within_spec.rb
@@ -14,6 +14,9 @@ def matches?(actual)
unless defined?(@expected)
raise"You must set an expected value using #of: be_within(#{delta}).of(expected_value)")
+ unless actual.is_a? Numeric
+ raise ArgumentError, "Expected a numeric value be within #{delta} of #{expected} but got #{actual.inspect}"
+ end
(super(actual) - expected).abs <= delta
@@ -59,6 +59,10 @@ module Matchers
matcher = be_within(0.5)
expect { matcher.matches?(5.1) }.to raise_error(ArgumentError, /must set an expected value using #of/)
+ it "raises an error if the actual value is not numeric" do
+ expect { be_within(0.1).of(0).matches?(nil) }.to raise_error(ArgumentError, /Expected a numeric value be within/)
+ end

0 comments on commit 675115d

Please sign in to comment.