3

私はまだRSpecの学習に取り組んでいるので、何かが完全に見落とされていたら申し訳ありません...

多くの材料を含むレシピのテストを書いています。成分は実際にはパーセントとして追加されるため (調合の合計 % 列を使用)、保存するたびに合計列が更新されるようにしたいと考えています。

したがって、現在、recipe_ingredient モデルの RSpec テストには次のようなものがあります。

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

私は何かを台無しにしていますか?テストの実行時に親オブジェクトにアクセスできないのですか? 保存後に親レシピ名を変更する基本的な方法を実行しようとしましたが、うまくいきませんでした。きっと私が見落としていた関係の何かだと思いますが、すべての関係は正しく設定されています。

ヘルプ/アドバイスをありがとう!

4

3 に答える 3

2

update_attribute現在のオブジェクトの属性を更新するためのものです。つまりupdate_attribute、属性を更新したいオブジェクトを呼び出す必要があります。この場合、材料ではなくレシピを更新します。だからあなたは電話しなければなりませんrecipe.update_attribute(:total_percentage, ...)

また、材料は他の材料ではなくレシピに属します。したがって、self.ingredients.sum(:percentage)実際には を呼び出す必要がありますrecipe.ingredients.sum(:percentage)

@recipeまた、テストする前にリロードする必要がありますtotal_percentage。と同じデータベース レコードを参照してい@ingredient.recipeますが、メモリ内の同じ Ruby オブジェクトを指していないため、一方への更新は他方には表示されません。を保存した後、リロード@recipeしてデータベースから最新の値を取得します@ingredient

于 2010-07-01T20:35:09.303 に答える
2

ちなみに、すでに factory_girl を使用しているため、 Ingredient をより明確な方法で構築できます。

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

これにより、Ingredient がビルドされて保存されます。

于 2010-07-01T21:28:19.930 に答える
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

expect は lambda{}.should のエイリアスです。詳細については、rspec.rubyforge.org/rspec/1.3.0/classes/Spec/Matchers.html#M000168 をご覧ください。

于 2010-07-23T20:02:21.467 に答える