2010-07-01 78 views
3

Rails的關係和回調測試模型我還在學習RSpec的工作,所以我很抱歉,如果完全忽略了什麼...在使用RSpec和Factory_Girl

我正在寫一個測試的食譜有很多成分。這些成分實際上是以百分比形式添加的(配方中的總列數),所以我想確保在每次保存後總列更新。

所以現在我的RSpec的測試爲recipe_ingredient模型是這樣的:

it "should update recipe total percent" do 
    @recipe = Factory.create(:basic_recipe) 

    @ingredient.attributes = @valid_attributes.except(:recipe_id) 
    @ingredient.recipe_id = @recipe.id 
    @ingredient.percentage = 20 
    @ingredient.save! 

    @recipe.total_percentage.should == 20 
end 

我只是呼籲剛纔保存收據成分的快速更新的after_save的方法。這是非常直接的:

編輯:這update_percentage行動是在配方模型。我在保存原料後調用的方法只是查找它的配方,然後在其上調用此方法。

def update_percentage  
    self.update_attribute(:recipe.total_percentage, self.ingredients.calculate(:sum, :percentage)) 
end 

我搞砸了什麼?運行測試時,我沒有訪問父對象的權限嗎?我試圖運行一個基本的方法來保存後更改父配方名稱,但沒有奏效。我確定這是我忽略的關係中的一些東西,但是所有的關係都是正確設置的。

感謝您的任何幫助/建議!

回答

2

update_attribute用於更新當前對象的屬性。這意味着您需要在要更新屬性的對象上調用update_attribute。在這種情況下,您想要更新配方,而不是配料。所以你必須撥打recipe.update_attribute(:total_percentage, ...)

此外,配料屬於食譜,而不是其他成分。所以,而不是self.ingredients.sum(:percentage)你真的應該打電話recipe.ingredients.sum(:percentage)

另外,在測試它的total_percentage之前,您需要重新加載@recipe。即使它指向與@ingredient.recipe相同的數據庫記錄,它也不會指向內存中的同一個Ruby對象,因此更新爲一個不會出現在另一箇中。重新加載@recipe以在保存@ingredient後從數據庫中獲取最新值。

+0

對不起混淆update_percentage方法在配方模型中。 成分的after_save方法加載配方(@recipe = Recipe.find(self。),然後調用update_percentage(@ recipe.update_percentage) 如何在測試中重新加載配方? – sshefer 2010-07-01 21:06:20

+0

在測試中嘗試過「@ recipe.reload」,它工作正常。謝謝伊恩,沒有意識到我必須這樣做! – sshefer 2010-07-01 21:16:00

2

順便說一句,你可以在一個更清晰的方式建立自己的成分,因爲你正在使用factory_girl已經:

@ingredient = Factory(:ingredient, :recipe => @recipe, :percentage => 20) 

這將建立和保存的成分。

+0

我不值得:)。我的代碼感謝你。 – sshefer 2010-07-02 16:04:07

0

嘿,或者你在檢查食譜中的total_percentage之前放了@ recipe.reload,或者使用expect。

it "should update recipe total percent" do 
    @recipe = Factory.create(:basic_recipe) 
    expect { 
    @ingredient.attributes = @valid_attributes.except(:recipe_id) 
    @ingredient.recipe_id = @recipe.id 
    @ingredient.percentage = 20 
    @ingredient.save! 
    }.to change(@recipe,:total_percentage).to(20) 
end 

我建議看看這個演示文稿。關於rspec上新的和酷的東西的許多技巧。 http://www.slideshare.net/gsterndale/straight-up-rspec

期望是它的別名拉姆達{}應該,你可以在這裏閱讀更多關於它:rspec.rubyforge.org/rspec/1.3.0/classes/Spec/Matchers.html#M000168

相關問題