在控制器测试中失败方法失败

时间:2012-10-12 13:36:15

标签: ruby-on-rails-3 rspec factory-bot

我在测试destroy方法时遇到了一个奇怪的问题。我正在使用FactoryGirl和Rspec。

以下是有问题的方法。正如你所看到的,它实际上并没有破坏经销商,只是将它设置为依赖对象的active属性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

当我在应用程序中运行此方法时,它完全按照它应该执行的操作。现在,进行测试。

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

前3个测试通过,但最后3个测试都失败了(奇怪的是,如果我在user.active.should be_false之后加sleep(10)delete :destroy测试只会失败,但我们不会进入那个问题现在)。因此,当我检查测试日志时,它会经历整个销毁过程,但随后会执行ROLLBACK,因此由于某种原因它不会保存任何记录;但它没有给我任何更多的信息。

有没有人对此有任何想法?我已经尝试过我能想到的一切。

1 个答案:

答案 0 :(得分:2)

如果您重新加载dealer怎么办?测试中的dealer与控制器中的@dealer对象不同(ActiveRecord不执行标识映射)。

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