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, //jarkkoThanks 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-usersInviato 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
smime.p7s
Description: S/MIME cryptographic signature
_______________________________________________ rspec-users mailing list [email protected] http://rubyforge.org/mailman/listinfo/rspec-users
