2012-05-02 5 views
5

आरएसपीसी और फैक्टरी गर्ल के लिए नया, और इस लड़ाई को खोने के सत्यापन के साथ सत्यापन के माध्यम से है।परीक्षण आरएसपीसी 2.9.0 + फैक्टरीगर्ल 3.2

मेरे पास एक टेबल टेबल MealItems है जिसमें इसकी एक संपत्ति पर सत्यापन है। रेल कंसोल में मैं सफलतापूर्वक कर सकते हैं:

meal = Meal.create!(...) 
food = Food.create!(...) 
item1 = MealItem.create!(meal, food, 1234) # 1234 being the property that is required 

मैं तो पूर्ण रूप से अपने खाद्य पदार्थों की एक सरणी एक भी भोजन में MealItem के माध्यम से इस तरह प्राप्त कर सकते हैं:

meal.foods 

समस्या यह है कि मैं नहीं कर सकता कारखानों को सही तरीके से बनाने का तरीका जानें ताकि यह संबंध spec में उपलब्ध हो। मैं एक भोजन करने के लिए आइटम प्रदान कर सकते हैं, और उन का परीक्षण, लेकिन रिश्ते काम कर (meal.foods) के माध्यम से has_many नहीं मिल सकता है

मॉडल

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 

कल्पना/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 

कल्पना/मॉडल/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 

... 

मेरा प्रश्न है:

मैं कैसे सेटअप इन कारखानों तो मैं Meal.foods मेरी परीक्षणों में संदर्भित कर सकते हैं के रूप में मैं क्योंकि तालिका में शामिल होने पर सत्यापन की आवश्यकता का भोजन करने के लिए सीधे खाद्य पदार्थ नहीं सौंप सकते। क्या मैं टेस्ट के दौरान डीबी को मेलीटैम कारखानों को सही ढंग से नहीं लिख रहा हूं, और यही कारण है कि रिश्तों के माध्यम से हैसनी मेरे spec में मौजूद नहीं है?

किसी भी मदद की बहुत सराहना की जाती है।

उत्तर

0

हां, आपको मीलइटम के लिए एक कारखाने की ज़रूरत है, और सत्यापन को पारित करने के लिए आपको उस फैक्ट्री का उपयोग स्पेक में करने की आवश्यकता है। यदि आपके पास दो विदेशी कुंजी के अलावा कोई आवश्यक फ़ील्ड नहीं है, तो शायद यह पहले से ही काम करेगा। तो एक डिफ़ॉल्ट servering आकार के साथ कारखाने की स्थापना के बाद, तो आप इस जगह लेंगे:

@meal.meal_items << @item1 
@meal.meal_items << @item2 
@meal.meal_items << @item3 
इस के साथ

:

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

एक वैकल्पिक एक डिफ़ॉल्ट अपने मॉडल में आकार की सेवा स्थापित करने के लिए किया जाएगा। इससे आप अपने परीक्षणों को छोड़ने की अनुमति देंगे, और आपके वास्तविक कोड में भी आपके पसंदीदा वाक्यविन्यास का उपयोग करना आसान हो सकता है।