# rSpec / Nested Routes / Mocks

**URL:** <https://www.ruby-forum.com/t/rspec-nested-routes-mocks/114936>\
**Category:** Rails\
**Created:** [September 18, 2007, 11:31pm UTC](https://www.ruby-forum.com/t/rspec-nested-routes-mocks/114936 "2007-09-18T23:31:04Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![knb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/7ab992/32.png) [@knb](https://www.ruby-forum.com/u/knb)\
**Post date:** [September 18, 2007, 11:31pm UTC](https://www.ruby-forum.com/t/rspec-nested-routes-mocks/114936/1 "2007-09-18T23:31:04Z")

</div>

I’m having a terrible time trying to test a nested route with rSpec.  
I can’t seem to tell rSpec to expect the call @item.user. The  
following error message plagues me not matter how I try to fuss with  
the mock:

Spec::Mocks::MockExpectationError in ‘ItemsController handling POST /  
items should redirect to the new course on successful save’  
Mock ‘Item\_1002’ received unexpected message :user= with (#\<User:  
0x…fdb7bcd38 @name=“User\_1003”\>)

Any help would be greatly appreciated.

Here’s my setup. Problem line indicated with \*\*\*\*\*\*

–routes.rb–  
map.resources :users do |users|  
users.resources :items  
end

–items\_controller–  
def create  
@item = Item.new(params[:item])  
@item.user = User.find(params[:user\_id])

```
respond_to do |format|
  if @item.save

```

…etc…

–items\_controller\_spec–  
describe ItemsController, “create action” do

before do  
@item = mock\_model(Item, :to\_param =\> “1”)  
@user = mock\_model(User, :to\_param =\> “1”)  
Item.stub!(:new).and\_return(@course)  
User.stub!(:find).and\_return(@user)  
end

def post\_with\_successful\_save  
\*\*\*\*\* @item.should\_receive(:user)  
@item.should\_receive(:save).and\_return(true)  
post :create, :user\_id =\> 1, :item =\> {}  
end

it “should redirect to the new course on successful save” do  
post\_with\_successful\_save  
response.should redirect\_to(item\_url(“1”))  
end

---

<div class="post-metadata">

**Author:** ![knb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/7ab992/32.png) [@knb](https://www.ruby-forum.com/u/knb)\
**Post date:** [September 18, 2007, 11:54pm UTC](https://www.ruby-forum.com/t/rspec-nested-routes-mocks/114936/2 "2007-09-18T23:54:07Z")

</div>

On 9/18/07, knb [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> –items\_controller–
> 
> ```
> post :create, :user_id => 1, :item => {}
> 
> ```
> 
> end
> 
> it “should redirect to the new course on successful save” do  
> post\_with\_successful\_save  
> response.should redirect\_to(item\_url(“1”))  
> end
> 
> >

The problem is that you’re expecting #user when you’re actually  
calling #user=. So your expectation should be

@item.should\_receive(:user=).with(@user)

and you’ll also want to stub the call in your before block.  
@item = mock\_model(Item, :to\_param =\> “1”, :user= true)

Pat

---

<div class="post-metadata">

**Author:** ![knb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/7ab992/32.png) [@knb](https://www.ruby-forum.com/u/knb)\
**Post date:** [September 18, 2007, 11:55pm UTC](https://www.ruby-forum.com/t/rspec-nested-routes-mocks/114936/3 "2007-09-18T23:55:07Z")

</div>

On 9/18/07, Pat M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > 0x…fdb7bcd38 @name=“User\_1003”\>)
> > 
> > describe ItemsController, “create action” do  
> > @item.should\_receive(:save).and\_return(true)

erm, you don’t need to stub it since you’re setting the expectation  
every time in post\_with\_successful\_save.

Pat
