[rspec-users] should raise_error(ArgumentError) resulting in NoMethodError

David Chelimsky dchelimsky at gmail.com
Thu Aug 26 00:14:11 EDT 2010


On Aug 25, 2010, at 10:13 PM, Brian Ploetz wrote:

> 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>>

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


More information about the rspec-users mailing list