Mới đối với RSpec và Factory Girl, và thua trận chiến này!kiểm tra has_many thông qua với xác nhận bằng cách sử dụng RSpc 2.9.0 + FactoryGirl 3.2
Tôi có bảng kết hợp MealItems có xác thực trên một trong các thuộc tính của nó. Trong ray console tôi có thể làm thành công như sau:
meal = Meal.create!(...)
food = Food.create!(...)
item1 = MealItem.create!(meal, food, 1234) # 1234 being the property that is required
tôi có thể sau đó automagically nhận được một loạt các món ăn trong một bữa ăn cho qua MealItem như thế này:
meal.foods
Vấn đề là tôi không thể tìm ra cách tạo ra các nhà máy đúng cách để mối quan hệ này có sẵn trong spec. Tôi có thể gán các mục cần một bữa ăn, và thử nghiệm đó, nhưng không thể có được has_many qua mối quan hệ làm việc (meal.foods)
Models
class Meal < ActiveRecord::Base
has_many :meal_items
has_many :foods, :through => :meal_items
end
class MealItem < ActiveRecord::Base
belongs_to :meal
belongs_to :food
validates_numericality_of :serving_size, :presence => true,
:greater_than => 0
end
class Food < ActiveRecord::Base
has_many :meal_items
has_many :meals, :through => :meal_items
end
đặc tả/factories.rb
FactoryGirl.define do
factory :lunch, class: Meal do
name "Lunch"
eaten_at Time.now
end
factory :chicken, class: Food do
name "Western Family Bonless Chicken Breast"
serving_size 100
calories 100
fat 2.5
carbohydrates 0
protein 19
end
factory :cheese, class: Food do
name "Armstrong Light Cheddar"
serving_size 30
calories 90
fat 6
carbohydrates 0
protein 8
end
factory :bread, class: Food do
name "'The Big 16' Multigrain Bread"
serving_size 38
calories 100
fat 1
carbohydrates 17
protein 6
end
factory :item1, class: MealItem do
serving_size 100
association :meal, factory: :lunch
association :food, factory: :chicken
end
factory :item2, class: MealItem do
serving_size 15
association :meal, factory: :lunch
association :food, factory: :cheese
end
factory :item3, class: MealItem do
serving_size 76
association :food, factory: :bread
association :meal, factory: :lunch
end
factory :meal_with_foods, :parent => :lunch do |lunch|
lunch.meal_items { |food| [ food.association(:item1),
food.association(:item2),
food.association(:item3)
]}
end
end
đặc tả/mô hình/meal_spec.rb
...
describe "Nutritional Information" do
before(:each) do
#@lunch = FactoryGirl.create(:meal_with_foods)
@item1 = FactoryGirl.create(:item1)
@item2 = FactoryGirl.create(:item2)
@item3 = FactoryGirl.create(:item3)
@meal = FactoryGirl.create(:lunch)
@meal.meal_items << @item1
@meal.meal_items << @item2
@meal.meal_items << @item3
@total_cals = BigDecimal('345')
@total_fat = BigDecimal('7.5')
@total_carbs = BigDecimal('34')
@total_protein = BigDecimal('35')
end
# Would really like to have
#it "should have the right foods through meal_items" do
#@meal.foods[0].should == @item1.food
#end
it "should have the right foods through meal_items" do
@meal.meal_items[0].food.should == @item1.food
end
it "should have the right amount of calories" do
@meal.calories.should == @total_cals
end
...
Câu hỏi của tôi là:
Làm thế nào tôi thiết lập các nhà máy vì vậy tôi có thể tham khảo Meal.foods trong các thử nghiệm của tôi như tôi không thể gán thực phẩm trực tiếp đến một bữa ăn vì sự yêu cầu xác nhận trên bàn tham gia. Tôi không viết đúng các nhà máy MealItem cho DB trong quá trình kiểm tra, và đó là lý do tại sao mối quan hệ has_many không tồn tại trong spec của tôi?
Bất kỳ trợ giúp nào được đánh giá cao.