2013-08-06 114 views
0

我是Rspec和FactoryGirl的新用於測試ROR應用程序的。我試圖測試一個模型類方法add_product(product_id),它仍然失敗,雖然它工作時,我在瀏覽器上嘗試相同。這裏是模型代碼:在Rails中使用Rspec和FactoryGirl測試模型的類方法

class Cart < ActiveRecord::Base 
    has_many :line_items, inverse_of: :cart 

    def add_product(product_id) 
    current_item = line_items.find_by_product_id(product_id) 
    if current_item 
     current_item.quantity += 1 
    else 
     current_item = line_items.build(:product_id => product_id) 
    end 
    current_item 
    end 
end 

下面是車模型的失敗規格:

describe Cart do 
    before(:each) do 
    @cart = FactoryGirl.create(:cart) 
    @product = FactoryGirl.create(:product) 
    @line_item = FactoryGirl.create(:line_item, product_id: @product.id, cart_id: @cart.id) 
    end 
    it 'increases the quantity of line_item when a similar product is added' do 
    lambda {@cart.add_product(@product.id)}.should change {@line_item.quantity}.by(1) 
    end 
end 

這種失敗,我從Rspec的Failure/Error: lambda {@cart.add_product(@product.id)}.should change {@line_item.quantity}.by(1) result should have been changed by 1, but was changed by 0 得到這樣的信息

回答

0

數量正在更新,但你永遠不會堅持數據。所以數據永遠不會觸及數據庫,測試永遠不會看到變化。你會遇到與.build相同的問題,直到你明確地說出這個問題,它纔會被持久化。你可以通過做改變。

class Cart < ActiveRecord::Base 
    has_many :line_items, inverse_of: :cart 

    def add_product(product_id) 
    current_item = line_items.find_by_product_id(product_id) 
    if current_item 
     current_item.quantity += 1 
     current_item.save 
    else 
     current_item = line_items.create(:product_id => product_id) 
    end 
    current_item 
    end 
end 
+0

感謝@Eric的快速反應,但測試後持續仍無法'current_item'有另一種方式我可以重新寫入執行相同的測試規範? –

+1

當然你可以做'@ cart.add_product(@ product.id).quantity.should eq 2' 這種方法的問題是,它不會測試你的項目是否以這種方式持續存在。它只是測試你的邏輯工作。 –

+0

我只是想測試邏輯,我有項目堅持在我的代碼的不同部分,我會測試它是如何堅持在那一部分。你的答案就是我一直在尋找的東西。 –

相關問題