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