Testing Ruby Code with RSpec-mocks: Examples and Tips

Testing Ruby Code with RSpec-mocks: Examples and Tips

Last updated:
Testing Ruby Code with RSpec-mocks: Examples and Tips
Source
Table of Contents

Custom block to define what a double will return

When none of the predefined ways to define what your double will return (once(), twice() and so on) work for you, RSpec lets you specify a block to define exactly what you want a double to return.

For example, I want to make a double that will receive a method called :take! exactly four times. In the first three calls it should return 1 and on the fourth call it should raise an Exception:

it 'contrived example' do
    my_double = double()

    # create a counter outside so you can keep track
    # of how many times the method was called
    count = 0

    expect(my_double).to receive(':take!').exactly(4).times {
        count += 1 

        if count == 4
            raise Exception.new("Ka-boom!")
        else
            1
        end     
    }

    # rest of spec code...
    # ...
end

References:

Dialogue & Discussion