[rspec-users] Mocking / stubbing errors for ActiveRecord

Zach Dennis zach.dennis at gmail.com
Fri Feb 20 09:57:33 EST 2009


On Fri, Feb 20, 2009 at 9:20 AM, Matt Wynne <matt at mattwynne.net> wrote:
>
> On 19 Feb 2009, at 21:53, Zach Dennis wrote:
>
>> On Thu, Feb 19, 2009 at 4:24 PM, Matt Wynne <matt at mattwynne.net> wrote:
>>>
>>> On 19 Feb 2009, at 20:54, Martin wrote:
>>>
>>>> Hi,
>>>>
>>>> I'm trying to test my views using rspec. I want to test my edit- and
>>>> new-view also for the case an error occurs (something like "title can't
>>>> be
>>>> blank" and so on).
>>>> Can someone point me please to an example where I can see how to mock my
>>>> model and stub all methods needed for the view?
>>>
>>> I guess this isn't exactly what you want to hear, but I would counsel you
>>> against mocking your whole model object for a form with lots of fields -
>>> those kind of 'broad' mocks can be very brittle to changes in your domain
>>> model.
>>>
>>> Can you try using stub_model instead? This creates an instance of your
>>> actual model class, but with a crippled database connection. You can then
>>> create an invalid model object and throw it to the view. Something like:
>>>
>>> assigns[:book] = stub_model(Book, :title => '')
>>>
>>> If your model is at all interesting, you might want to keep the
>>> attributes
>>> that make a valid Book somewhere:
>>>
>>> valid_book = {
>>> :title => "Test Book Title",
>>> :author => "Test Author"
>>> }
>>> assigns[:book] = stub_model(Book, valid_book.merge(:title => ''))
>>>
>>> I generally hide these behind a helper method, like
>>>
>>> def stub_book(attributes = {})
>>> stub_model Book, {
>>>  :title => "Test Book Title",
>>>  :author => "Test Author"
>>> }.merge(attributes)
>>> end
>>
>> Why hide them behind a helper? Why not just only specify them in
>> examples where they are used? ie:
>>
>> it "should display the book title" do
>>  @book.stub!(:title).and_return "The Scarlet Letter"
>>  render ...
>>  response.should include_text("The Scarlet Letter")
>> end
>
> Why hide them in a helper? because I don't want the noise of all the
> attributes needed to make a valid book in each test.
>
> @book = stub_book :title => "The Scarlet Letter"
>
> This is basically the same pattern people use things like factory_girl for,
> just using stub_model.

Ah, I'm with you now. I thought you were eluding to doing the
following (but I realize now that wasn't what you were getting at):

    assigns[:book] = stub_book
    render ..
    response.should include_text("The Scarlet Letter")


-- 
Zach Dennis
http://www.continuousthinking.com
http://www.mutuallyhuman.com


More information about the rspec-users mailing list