Tony Beninate
Tony Beninate

Reputation: 1985

Destroy method failing in controller test

I'm experiencing a bizarre issue testing a destroy method. I'm using FactoryGirl and Rspec.

Here's a look at the method in question. As you can see, it doesn't actually destroy the dealer, just set it and it's dependent object's active attributes to false:

dealers_controller.rb

def destroy
  @dealer = Dealer.find(params[:id])
  @dealer.active = false
  @dealer.save!
  @dealer.leads.each { |lead|
    lead.active = false
    lead.save!
  }
  @dealer.users.each { |user|
    user.active = false
    user.save!
  }
  redirect_to dealers_path
end

When I run this method in the application it does exactly what it should do. Now, on to the test.

dealers_controller_spec.rb

describe "#destroy" do
  context "when deleting a valid record" do
    let(:dealer) { FactoryGirl.create(:dealer_with_stuff) }  

    before do
      @user = FactoryGirl.build(:admin_user)
      login_user  
      delete :destroy, :id => dealer.id
    end
    it { should assign_to(:dealer).with(dealer) }
    it { should redirect_to(dealers_path) }
    it { should set_the_flash }
    it "is no longer active" do
      dealer.active.should be_false
    end
    it "has no active users" do
      dealer.users.each do |user|
        user.active.should be_false
      end
    end
    it "has no active leads" do
      dealer.leads.each do |lead|
        lead.active.should be_false
      end
    end
  end
end

The first 3 tests pass, but the last 3 all fail (weirdly, the user.active.should be_false test only fails if I put a sleep(10) after delete :destroy up above, but let's not get into that issue now). So when I check the test log, it goes through the entire destroy process, but then does a ROLLBACK, so for some reason it doesn't save any of the records; but it doesn't give me any more information than that.

Does anyone have any thoughts on this? I've tried everything I can possibly think of.

Upvotes: 0

Views: 452

Answers (1)

Andy Lindeman
Andy Lindeman

Reputation: 12165

What if you reload the dealer? The dealer in your tests is different from the @dealer object in the controller (ActiveRecord doesn't do identity maps).

before do
  @user = FactoryGirl.build(:admin_user)
  login_user  
  delete :destroy, :id => dealer.id
  dealer.reload # << add this
end

Upvotes: 2

Related Questions