2012-05-02 26 views
5

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.

Trả lời

0

Có, bạn cần một nhà máy cho MealItem và bạn cần sử dụng nhà máy đó trong thông số kỹ thuật để vượt qua xác thực. Nếu bạn không có bất kỳ trường bắt buộc nào khác ngoài hai khóa ngoại, có lẽ nó sẽ hoạt động. Vì vậy, sau khi thiết lập nhà máy sản xuất với kích thước servering mặc định, bạn sẽ thay thế này:

@meal.meal_items << @item1 
@meal.meal_items << @item2 
@meal.meal_items << @item3 

với điều này:

FactoryGirl.create(:meal_item, :meal => @meal, :item => @item1) 
FactoryGirl.create(:meal_item, :meal => @meal, :item => @item1) 
FactoryGirl.create(:meal_item, :meal => @meal, :item => @item1) 

Một thay thế sẽ được thiết lập mặc định phục vụ kích thước trong mô hình của bạn. Điều đó sẽ cho phép bạn để lại các bài kiểm tra của bạn như họ đã có, và có thể làm cho nó dễ dàng hơn để sử dụng cú pháp ưa thích của bạn trong mã thực tế của bạn là tốt.

Các vấn đề liên quan