[rspec-users] Rspecing this simple controller it is driving me mad...

roberto belardo backslash451 at yahoo.it
Tue Apr 8 16:06:19 EDT 2008


Everything seemed so fine, but when i tried to
investigate a little i discovered this tremendous
behaviour of the spec:

------------------------------- CommentsController
def create
  @comment = Comment.new(params[:comment])
  @user = User.find(params[:user_id])
  @comment.author = 'foooooobar'
  @comment.save
end

------------------------------- CommentsController
Spec
describe CommentsController, "handling POST/comments"
do
  before(:each) do
    @user = mock_model(User, :to_param => "2")
    @comment = mock_model(Comment, :to_param => "1",
:author => @user)
   
User.should_receive(:find).at_least(1).times.and_return(@user)
    Comment.stub!(:new).and_return(@comment)
    @comment.stub!(:author=)
  end

  def post_with_successful_save
    @comment.should_receive(:save).and_return(true)
    @comment.should_receive(:author=)
    post :create, :user_id => @user_id, :comment => {}
  end

  it "should create a new comment" do
   
Comment.should_receive(:new).with({}).and_return(@comment)
    post_with_successful_save
    @comment.author.should be(@user)
  end
end

------------------------------- Autotest:
... 0 failures

How can the spec pass if i test that @comment.author
should be @user but in the controller i set a
fooooobar string in the @comment.author?
Better question: wich is the right way to test that
create action to be sure, it will set the author of
the comment?


--- Jarkko Laine <jarkko at jlaine.net> ha scritto:

...

> Short answer: you haven't stubbed the author= method
> for the comment  
> mock, only author.
> 
> A bit longer answer: Are you sure you can trust the
> user to only  
> submit valid user ids? With your current code,
> anyone can change the  
> user_id parameter in the call and fake any user id
> she wants. This  
> might be intentional (if there are only admin users
> in your app), just  
> pointing it out. You can also simplify your action
> by just saying  
> @user.comments.create(params[:comment]) once you
> have the user fetched.
> 
> Cheers,
> //jarkko
> 
> >
> > Thanks in advance,
> > Roberto.
> >
> >
> >      Inviato da Yahoo! Mail.
> > La casella di posta intelligente.
> > http://it.docs.yahoo.com/mail/overview/index.html
> > _______________________________________________
> > rspec-users mailing list
> > rspec-users at rubyforge.org
> > http://rubyforge.org/mailman/listinfo/rspec-users
> 
> --
> Jarkko Laine
> http://jlaine.net
> http://dotherightthing.com
> http://www.railsecommerce.com
> http://odesign.fi
> 
> 
> > _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users



      Inviato da Yahoo! Mail. 
La casella di posta intelligente.
http://it.docs.yahoo.com/mail/overview/index.html


More information about the rspec-users mailing list