# Easy AR association stubbing

**URL:** <https://www.ruby-forum.com/t/easy-ar-association-stubbing/116406>\
**Category:** RSpec\
**Created:** [October 5, 2007, 7:43am UTC](https://www.ruby-forum.com/t/easy-ar-association-stubbing/116406 "2007-10-05T07:43:28Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Matthew\_Heidemann](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/d9b06d/32.png) [@Matthew\_Heidemann](https://www.ruby-forum.com/u/Matthew_Heidemann)\
**Post date:** [October 5, 2007, 7:43am UTC](https://www.ruby-forum.com/t/easy-ar-association-stubbing/116406/1 "2007-10-05T07:43:28Z")

</div>

I’ve added a method to the mock class that makes it pretty easy to  
stub associations in rails. I’ve been using it for awhile and it seems  
to cut down on a lot of setup code for the controller and model specs  
that use associations.

#before  
@person = mock\_model(Person)  
posts = mock(‘post\_proxy’)  
posts.stub!(:build).and\_return(mock\_model(Post, :save =\> true))  
@person.stub!(:posts).and\_return(posts)

# now

@person = mock\_model(Person)  
@person.stub\_association!(:posts, :find\_by\_title =\> mock\_model(Post))

Just add this to the spec helper

module Spec  
module Mocks  
module Methods  
def stub\_association!(association\_name, methods\_to\_be\_stubbed =  
{})  
mock\_association = Spec::Mocks::Mock.new(association\_name.to\_s)  
methods\_to\_be\_stubbed.each do |method, return\_value|  
mock\_association.stub!(method).and\_return(return\_value)  
end  
self.stub!(association\_name).and\_return(mock\_association)  
end  
end  
end  
end

---

<div class="post-metadata">

**Author:** ![Matthew\_Heidemann](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/d9b06d/32.png) [@Matthew\_Heidemann](https://www.ruby-forum.com/u/Matthew_Heidemann)\
**Post date:** [October 6, 2007, 3:59am UTC](https://www.ruby-forum.com/t/easy-ar-association-stubbing/116406/2 "2007-10-06T03:59:04Z")

</div>

Thanks I’ll give it a try and praise you later.

---

<div class="post-metadata">

**Author:** ![Matthew\_Heidemann](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/d9b06d/32.png) [@Matthew\_Heidemann](https://www.ruby-forum.com/u/Matthew_Heidemann)\
**Post date:** [October 6, 2007, 11:45pm UTC](https://www.ruby-forum.com/t/easy-ar-association-stubbing/116406/3 "2007-10-06T23:45:43Z")

</div>

But what if I need to use posts as such?

@person = mock\_model(Person)  
@person.stub\_association!(:posts, :find\_by\_title =\> mock\_model(Post))

posts.stub!(:count).and\_return(2)

---

<div class="post-metadata">

**Author:** ![Matthew\_Heidemann](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/d9b06d/32.png) [@Matthew\_Heidemann](https://www.ruby-forum.com/u/Matthew_Heidemann)\
**Post date:** [October 7, 2007, 12:12am UTC](https://www.ruby-forum.com/t/easy-ar-association-stubbing/116406/4 "2007-10-07T00:12:37Z")

</div>

On 10/6/07, Andrew WC Brown [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> [http://rubyforge.org/mailman/listinfo/rspec-users](http://rubyforge.org/mailman/listinfo/rspec-users)

Take a look at the source: you can pass in whatever methods you want  
to be stubbed. So, for example,

@person.stub\_association!(:posts, :find\_by\_title =\> mock\_model(Post),  
:count =\> 2)

Also, you should be able to stub after the fact like so:

@person.posts.stub!(:count).and\_return 2

Pat

---

<div class="post-metadata">

**Author:** ![Matthew\_Heidemann](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/d9b06d/32.png) [@Matthew\_Heidemann](https://www.ruby-forum.com/u/Matthew_Heidemann)\
**Post date:** [October 10, 2007, 10:05am UTC](https://www.ruby-forum.com/t/easy-ar-association-stubbing/116406/5 "2007-10-10T10:05:41Z")

</div>

you no longer have @players

try  
assigns[:players].should eql(@game.players)

---

<div class="post-metadata">

**Author:** ![Matthew\_Heidemann](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/d9b06d/32.png) [@Matthew\_Heidemann](https://www.ruby-forum.com/u/Matthew_Heidemann)\
**Post date:** [October 8, 2007, 9:26pm UTC](https://www.ruby-forum.com/t/easy-ar-association-stubbing/116406/6 "2007-10-08T21:26:35Z")

</div>

Here’s my old association:

```
@game = mock_game(:to_param => "1")
Game.stub!(:find).and_return(@game)
@players = mock('player_proxy')
@players.stub!(:build).and_return(mock_model(Player, :save => true))
@game.stub!(:players).and_return(@players)

```

Here’s one of my specs:

it “should assign the found players for the view” do  
do\_get  
assigns[:players].should eql(@players)

end

Everything works great. So I try to use assoication\_stub!

```
@game = mock_game(:to_param => "1")
Game.stub!(:find).and_return(@game)
@game.stub_association!(:players, :build => mock_model(Player, :save 

```

=\>  
true))

1. 

‘PlayersController handling GET /saltmines/games/1/players should assign  
the  
found players for the view’ FAILED  
expected nil, got #\<Spec::Mocks::Mock:0x1a53358 @name=“players”\> (using  
.eql?)  
/Volumes/EXTERNAL/web/omenking.ca/spec/controllers/players\_controller\_spec.rb:103:  
/Volumes/EXTERNAL/web/omenking.ca/spec/controllers/players\_controller\_spec.rb:63:

Any suggestions?
