Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rspec any_instance should_receive should have received the following messages but didn't [closed]

I'm having an issue with a scaffold test for rspec where any_instance.should_receive is throwing an error: Failure/Error: Unable to find matching line from backtrace Exactly one instance should have received the following message(s) but didn't: update_attributes

Rspec code, using FactoryGirl and strong_parameters:

describe "PUT update" do
   describe "with valid params" do
     it "updates the requested acquisition" do
       puts "starting updates the requested acquisition"
       acquisition = create(:acquisition)
       # Assuming there are no other acquisitions in the database, this
       # specifies that the Acquisition created on the previous line
       # receives the :update_attributes message with whatever params are
       # submitted in the request.
       Acquisition.any_instance.should_receive(:update_attributes).with(:acquisition =>    {:person_id => '10'})
      puts "before the put "
       put :update, :id => acquisition.id, :acquisition => { :person_id => '10'}
       puts "ending the updates the requested acquisition"
     end   
  end
end

Controller code:

def update
    @acquisition = Acquisition.find(params[:id])
    puts "acquisition is #{@acquisition.inspect}"
    respond_to do |format|
      if @acquisition.update_attributes!(acquisition_params)
        puts "updated the thing! #{@acquisition.inspect}"
        format.html { redirect_to(@acquisition, :notice => 'Acquisition was successfully updated.') }
        format.xml  { head :ok }
      else
        puts "failed to update the thing!"
        format.html { render :action => "edit" }
        format.xml  { render :xml => @acquisition.errors, :status => :unprocessable_entity }
      end
    end
  end

Test outputs:

starting updates the requested acquisition
before the put
acquisition is #<Acquisition id: 502, sample_id: 7, person_id: 7, method: nil>
params is acqusition_params is {"person_id"=>"10"}
updated the thing! #<Acquisition id: 502, sample_id: 7, person_id: 10, method: nil>
ending the updates the requested acquisition
F

1) AcquisitionsController PUT update with valid params updates the requested acquisition
 Failure/Error: Unable to find matching line from backtrace
   Exactly one instance should have received the following message(s) but didn't: update_attributes

Given that I'm printing out the updated object in my controller and it's correct, why is the test failing?

Thanks!

like image 461
Denise Mauldin Avatar asked Nov 04 '22 03:11

Denise Mauldin


1 Answers

This might be a typo in your paste, but in case it is not, your test should test if update_attributes! is received, not update_attributes

Acquisition.any_instance.should_receive(:update_attributes!)
like image 95
rocket scientist Avatar answered Nov 09 '22 16:11

rocket scientist