0

destroyメソッドのテストで奇妙な問題が発生しています。FactoryGirlとRspecを使用しています。

問題のメソッドを見てみましょう。ご覧のとおり、実際にはディーラーを破壊するのではなく、設定するだけで、依存オブジェクトのactive属性は次のようになりfalseます。

ディーラー_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

このメソッドをアプリケーションで実行すると、実行する必要があることを正確に実行します。さて、テストに移りましょう。

ディーラー_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 :destroyROLLBACK

誰かがこれについて何か考えを持っていますか?私は考えられるすべてのことを試しました。

4

1 に答える 1

2

をリロードするとどうなりますdealerか? テスト内のはコントローラー内dealerのオブジェクトとは異なります@dealer(ActiveRecord は ID マップを行いません)。

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 に答える