2012-10-12 72 views
0

我遇到了一個測試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,所以出於某種原因它不會保存任何記錄;但它並沒有給我更多的信息。

有沒有人對此有任何想法?我試過了我可能想到的一切。

回答

2

如果您重新加載dealer,該怎麼辦?測試中的dealer與控制器中的@dealer對象不同(ActiveRecord不執行標識映射)。

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