Mocha raise exception first call, return value second call


#1

Is there a way to have mocha raise an exception the first time an stub
is called, and then return a value the second time it is called?

First example, I’m trying to connect to a server and test the case where
my first attempt raises a ‘Server busy’ exception or something of that
sort. So I wait, then retry and then the second time the connection is
successful.

Cheers!
Ray


#2

On 3/6/07, Raymond O’Connor removed_email_address@domain.invalid wrote:

Is there a way to have mocha raise an exception the first time an stub
is called, and then return a value the second time it is called?

First example, I’m trying to connect to a server and test the case where
my first attempt raises a ‘Server busy’ exception or something of that
sort. So I wait, then retry and then the second time the connection is
successful.

server.expects(:connect).returns do
server.expects(:connect).returns(true)
raise Busy
end

Hackish? Unclean? :wink:

jeremy


#3

On 07/03/07, Raymond O’Connor removed_email_address@domain.invalid wrote:

Is there a way to have mocha raise an exception the first time an stub
is called, and then return a value the second time it is called?

First example, I’m trying to connect to a server and test the case where
my first attempt raises a ‘Server busy’ exception or something of that
sort. So I wait, then retry and then the second time the connection is
successful.

results = [ lambda { raise ServerBusy }, lambda { return true } ]
object.stubs(:connect).returns { lambda { results.shift.call } }

You might be interested in another recent thread (
http://rubyforge.org/pipermail/mocha-developer/2007-March/000225.html)
which
discusses how we might come up with a syntax to make this easier.


#4

Thanks for the help both of you! I ended up using the method James
proposed (it was cleaner :wink: ).

Very interesting thread too. From a usability standpoint, adding a
raises method to TestCase seems to provide the most intuitive syntax…
at least for me it does. Can’t wait to see how things pan out!