Can you show your spec? I'm not sure why you're using assigns in the controller spec. David explained that it doesn't work like that. Your spec should look something like
it "should destroy the record" do mock_comment = stub_model Comment Comment.stub!(:find).and_return mock_comment mock_comment.should_receive(:destroy) delete :destroy, :id => mock_comment.to_param end Pat On Wed, Feb 25, 2009 at 1:57 AM, Evgeny Bogdanov <evgeny.bogda...@gmail.com> wrote: > Thank you, David! > One small follow-up question. > Is there is a way to mock an object "@comment" in the controller_spec > for the function? > I didn't manage to do it. > > def destroy > �...@destroy_id = @comment.id #to be used in rendering partial > �...@comment.destroy > end > > Looks like assigns[:comment] = mock("comment") works only for views? > > Thank you, > Evgeny > > > On Feb 23, 8:32 pm, David Chelimsky <dchelim...@gmail.com> wrote: >> On Fri, Feb 20, 2009 at 10:17 AM, Evgeny Bogdanov >> >> <evgeny.bogda...@gmail.com> wrote: >> > Hello, >> >> > I am trying to implement the following scenario, but I am stuck ... >> > The thing is I want to initialize a variable @comment when the stub >> > function "find_comment" is called. >> > The way I do it below doesn't work, since >> > "before_filter :find_comment" returns true/false and @comment >> > initialization is done inside it. Could you please give me a hint how >> > to do it? >> >> > One solution would be to use >> > Comment.stub!(:find).and_return(@comment) and do not use the stub >> > find_comment. >> >> That's the way to do it. >> >> > But how to do it in general, when there is no expression like "@var = >> > my_var.function" in the controller and variable @var is defined in >> > another place and controller just uses it. >> >> In general, it's best to avoid dealing directly with internal state on >> an object that you're specifying and only manipulate its state through >> public methods and/or mocks/stubs on collaborators. So in this case, >> I'd just stub Comment.find, as mentioned above. >> >> > my_var.stub!(:function).and_return(@var) doesn't seem to be working. >> >> > Is there is something like >> > my_var.stub!(:function).add_variable(@var).and_return(:true) >> >> Nope. For the reasons stated above. This is too invasive. >> >> Cheers, >> David >> >> >> >> > ? >> >> > Thank you, >> > Evgeny >> > =============controller_file >> > before_filter :find_comment, :only => [:destroy] >> >> > def destroy >> > �...@destroy_id = @comment.id #to be used in rendering partial >> > �...@comment.destroy >> >> > respond_to do |format| >> > format.js >> > end >> > end >> >> > def find_comment >> > @comment = Comment.find(:first, :conditions => ['id= ?',params >> > [:comment_id]]) >> > end >> > ===============spec_file >> > spec code >> > describe CommentsController, "while deleting a comment" do >> > it "should render destroy.rjs in case of success" do >> > �...@comment = mock_model(Comment) >> > �...@comment.stub!(:id).and_return(1) >> > �...@comment.stub!(:destroy).and_return(:true) >> >> > controller.stub!(:find_comment).and_return(@comment) >> >> > # execute ajax request >> > request.env["HTTP_ACCEPT"] = "application/javascript" >> > post :destroy, :comment_id => 1, :item_id => 1, :item_type => >> > "Space" >> >> > response.should render_template("destroy") >> > end >> > end >> > _______________________________________________ >> > rspec-users mailing list >> > rspec-us...@rubyforge.org >> >http://rubyforge.org/mailman/listinfo/rspec-users >> >> _______________________________________________ >> rspec-users mailing list >> rspec-us...@rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users > _______________________________________________ > rspec-users mailing list > rspec-users@rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users > _______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users