Environment
------------------
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10.4.0]
rspec (1.3.0)
Code
-------
def currency_to_dollars(currency_amount)
raise ArgumentError("Currency amount can't be nil") if
currency_amount.nil?
end
Spec
--------
it "should raise an ArgumentError if currency_amount is nil" do
lambda { @service.currency_to_dollars(nil) }.should
raise_error(ArgumentError)
end
Results in this failure:
1)
'Service should raise an ArgumentError if currency_amount is nil' FAILED
expected ArgumentError, got #<NoMethodError: undefined method
`ArgumentError' for #<Service:0x0000010087e5f0>>
test/spec/service_spec.rb:92:in `block (2 levels) in <top (required)>'
Changing the test to either of these two variants allows the the to
pass:
lambda { @service.currency_to_dollars(nil) }.should
raise_error(StandardError)
lambda { @service.currency_to_dollars(nil) }.should raise_error
Why am I unable to test for a specific StandardError subclass?
Thanks in advance for any help.
BP
on 2010-08-26 05:13
on 2010-08-26 05:25
FYI, the same thing happens with rspec 2.0.0.beta.20 as well:
1) Service should raise an ArgumentError if currency_amount is nil
Failure/Error: lambda
{ @service.currency_to_dollars(nil) }.should
raise_error(ArgumentError)
expected ArgumentError, got #<NoMethodError: undefined method
`ArgumentError' for #<Service:0x000001029665d8>>
# ./test/spec/service_spec.rb:92:in `block (2 levels) in <top
(required)>'
on 2010-08-26 06:15
On Aug 25, 2010, at 10:13 PM, Brian Ploetz wrote: > > Spec > -------- > it "should raise an ArgumentError if currency_amount is nil" do > lambda { @service.currency_to_dollars(nil) }.should raise_error(ArgumentError) > end > > Results in this failure: > 1) > 'Service should raise an ArgumentError if currency_amount is nil' FAILED > expected ArgumentError, got #<NoMethodError: undefined method `ArgumentError' for #<Service:0x0000010087e5f0>> This message is telling you there is no ArgumentError method, not that the constant ArgumentError is missing. The method needs to be (adding ".new"): def currency_to_dollars(currency_amount) raise ArgumentError.new("Currency amount can't be nil") if currency_amount.nil? end > test/spec/service_spec.rb:92:in `block (2 levels) in <top (required)>' > > > Changing the test to either of these two variants allows the the to pass: > > lambda { @service.currency_to_dollars(nil) }.should raise_error(StandardError) > lambda { @service.currency_to_dollars(nil) }.should raise_error These pass because NoMethodError, which is what is being thrown, is a subclass of StandardError and Exception. HTH, David
on 2010-08-26 06:55
On Aug 26, 2010, at 12:14 AM, David Chelimsky wrote: >> currency_amount.nil? >> 1) > raise ArgumentError.new("Currency amount can't be nil") if > currency_amount.nil? > end You might see this form, too. def currency_to_dollars(currency_amount) raise ArgumentError, "Currency amount can't be nil" if currency_amount.nil? end Note the comma that separates the arguments to raise (Kernel#raise). -Rob >> lambda { @service.currency_to_dollars(nil) }.should raise_error > > These pass because NoMethodError, which is what is being thrown, is > a subclass of StandardError and Exception. > > HTH, > David > _______________________________________________ > rspec-users mailing list > rspec-users@rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users Rob Biedenharn Rob@AgileConsultingLLC.com http://AgileConsultingLLC.com/ rab@GaslightSoftware.com http://GaslightSoftware.com/
on 2010-08-26 15:21
*smacks head* Duh. Thanks David and Rob! On Aug 26, 12:35 am, Rob Biedenharn <R...@AgileConsultingLLC.com>
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.