On 8.4.2008, at 23.06, roberto belardo wrote:

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?

Because @comment.should_receive(:author=) stubs the method so it has no effect after that. I would advice against using it in a general purpose helper such as post_with_successful_save and instead use it in an actual spec if needed.



Better question: wich is the right way to test that
create action to be sure, it will set the author of
the comment?

Since you're testing that "@comment.author.should be(@user)", I see no reason to explicitly have "@comment.should_receive(:author=)". The former correctly tests the behaviour, whereas the latter checks the actual implementation, which in this case is superfluous. I hardly ever use should_receive with a setter method such as author=, but it might just be me.

Cheers,
//jarkko




--- Jarkko Laine <[EMAIL PROTECTED]> 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
[email protected]
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
[email protected]
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
_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users

--
Jarkko Laine
http://jlaine.net
http://dotherightthing.com
http://www.railsecommerce.com
http://odesign.fi


Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to