On Jul 16, 2011, at 2:58 PM, Wilson Bilkovich wrote: > On Sat, Jul 16, 2011 at 1:49 PM, David Chelimsky <dchelim...@gmail.com> wrote: >> >> On Jul 11, 2011, at 8:38 PM, David Zhang wrote: >> >>> I'm wondering how you tell RSpec to ignore null objects entirely. >>> For instance, I have this restaurant_id call below: >>> >>> def create >>> @meal = Meal.new(params[:meal]) >>> @meal.restaurant_id = current_user.restaurant_id # automatically decide >>> the restaurant-meal relationship >>> if @meal.save >>> flash[:notice] = "The meal was saved successfully." >>> redirect_to :action => :index >>> else >>> render :action => :new >>> end >>> end >>> >>> ...and I'm not sure how to deal with it. My spec test looks like this >>> right now: >>> >>> describe "POST create" do >>> let(:meal) { mock_model(Meal).as_null_object } >>> >>> before(:each) do >>> Meal.stub(:new).and_return(meal) >>> # meal.stub(:restaurant_id) Not sure what to do here!!!!!!!! >>> end >>> >>> it "creates a new meal" do >>> Meal.should_receive(:new).with("name" => "Pizza").and_return(meal) >>> post :create, :meal => { "name" => "Pizza" } >>> end >>> >>> context "when the meal saves successfully" do >>> before(:each) do # just for balance; as_null_object causes a truthy >>> value to be returned anyway >>> meal.stub(:save).and_return(true) >>> end >>> >>> it "sets a flash message" do >>> post :create >>> flash[:notice].should eq("The meal was saved successfully.") >>> end >>> >>> it "redirects to the meals index" do >>> post :create >>> response.should redirect_to(:action => :index) >>> end >>> end >>> >>> context "when the meal fails to save" do >>> before(:each) do >>> meal.stub(:save).and_return(false) >>> end >>> >>> it "assigns @meal" do >>> post :create >>> assigns[:meal].should eq(meal) >>> end >>> >>> it "renders the new template" do >>> post :create >>> response.should render_template("new") >>> end >>> end >>> >>> end >>> >>> If anyone knows the best way to deal with this, please let me know. I >>> really want to adeptly use RSpec in the future. >> >> What's the failure message you're getting? >> > Well, he's basically got a conditional somewhere: > if foo.baz > else > end > ..and he wants to use a proxy object as the return value of 'baz' > instead of nil. > Unfortunately, MRI just won't let you do that, so he needs to set > different expectations. > > That's my understanding of the question, at least. > --Wilson.
Depends on the failure message. If it is that current_user is nil, then the fix is to set up or stub the current user. If it's that the mock object doesn't respond to restaurant_id= (not restaurant_id, which is what the example is stubbing), then the fix is to stub restaurant_id=. Might end up being both are problems, but I don't know what else is going on elsewhere in the setup. That's why I was asking about the failure message :)
_______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users