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

Jarkko Laine jarkko at jlaine.net
Tue Apr 8 16:35:08 EDT 2008


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 <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
> _______________________________________________
> 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


-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2417 bytes
Desc: not available
Url : http://rubyforge.org/pipermail/rspec-users/attachments/20080408/3b54af44/attachment.bin 


More information about the rspec-users mailing list