0

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

下面来看看有问题的方法。如您所见,它实际上并没有破坏经销商,只需将其及其依赖对象的active属性设置为false

经销商控制器.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

当我在应用程序中运行这个方法时,它会完全按照它应该做的事情去做。现在,开始测试。

经销商控制器规格.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 个测试全部失败(奇怪的是,如果我在上面加上一个after ,user.active.should be_false测试才会失败,但我们现在不要讨论这个问题)。因此,当我检查测试日志时,它会经历整个销毁过程,但随后会执行 a ,因此由于某种原因它不会保存任何记录;但它没有给我更多的信息。sleep(10)delete :destroyROLLBACK

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

4

1 回答 1

2

如果你重新加载dealer? 您的dealer测试@dealer中的 与控制器中的对象不同(ActiveRecord 不执行身份映射)。

before do
  @user = FactoryGirl.build(:admin_user)
  login_user  
  delete :destroy, :id => dealer.id
  dealer.reload # << add this
end
于 2012-10-12T17:24:35.587 回答