[rspec-users] catching errors, rspec basics

Ben Mabey ben at benmabey.com
Tue Jan 29 23:41:18 EST 2008


Sematics..  the method is never returning an error, it raises one.  So 
you can't say @audience.stats="dsfds" and expect to see an exception 
returned right?
Since an exception is being raised you have to think of another way of 
testing it aside from checking it's return value... So you could do 
something like:

an_error_was_raised = false
begin
  @audience.stats = 'Market Goblin'
rescue
  an_error_was_raised = true
end
an_error_was_raised.should == true

I am not suggesting you do this.  This is just to illustrate how you 
would going about testing to see if an error was raised.  The 
raise_error matcher is slightly more complicated in order to be able to 
ensure certain errors are raised but this is the general idea.  So the 
lambda does not return an error but the lambda is passed into the 
matcher so it can perform a similar operation as the code above 
illustrates.  I hope that clarified things a bit.

Here is another example for good measure with a lambda involved.. you 
can then see how a lambda how be useful in this situation:

an_error_was_raised = false
my_code = lambda { @audience.stats = 'Market Goblin' }

begin
  my_code.call
rescue
  an_error_was_raised = true
end
an_error_was_raised.should == true

Better?

-Ben


Andrew WC Brown wrote:
> So if I understand correctly,
>
> The following didn't raise an error:
>
> @audience.stats = 'Market Goblin'
> @audience.stats.should raise_error
>
> because audience.stats didn't return an error.
>
> Where as lambda will return an error.
>
> On Jan 29, 2008 10:58 PM, Ben Mabey <ben at benmabey.com 
> <mailto:ben at benmabey.com>> wrote:
>
>     Andrew WC Brown wrote:
>     > ohhhhh, I left in:
>     >
>     >   it "should return an error when passed a string" do
>     >     @audience.stats = 'Market Goblin'
>     >     lambda {@audience.stats = 'Market Goblin'}.should raise_error
>     >   end
>     >
>     > when yours is:
>     >
>     >   it "should return an error when passed a string" do
>     >     lambda {@audience.stats = 'Market Goblin'}.should raise_error
>     >   end
>     >
>     > I've seen lambda before but not sure what it does.
>
>     A lambda in ruby is like a block or a Proc.  There are some
>     differences
>     between them, but for this simple use you can just think of it as a
>     block of code that will be passed to the 'raise_error' matcher
>     that then
>     runs that block of code checking to see if an Exception is raised when
>     it is ran.  You can also pass in the specific exception type to be
>     more
>     specific.
>
>     As  a personal preference I like to alias lambda to 'running' in my
>     spec_helper.rb... I think this reads a lot better:
>     running {@audience.stats = 'Market Goblin'}.should raise_error
>
>     For more on lambdas refer to the pickaxe.  If you want more detailed
>     information of the subtle differences between them, Procs, blocks, and
>     methods check this out:
>     http://innig.net/software/ruby/closures-in-ruby.rb
>
>     -Ben
>
>
>     _______________________________________________
>     rspec-users mailing list
>     rspec-users at rubyforge.org <mailto:rspec-users at rubyforge.org>
>     http://rubyforge.org/mailman/listinfo/rspec-users
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users



More information about the rspec-users mailing list