2010-04-23 13 views
25

मैं FactoryGirl/shoulda का उपयोग करके एक सत्र अनुकरण करने की कोशिश कर रहा हूं (यह फिक्स्चर के साथ काम करता है लेकिन मुझे कारखानों का उपयोग करने में समस्याएं आ रही हैं)। मैं कारखानों (उपयोगकर्ता लॉगिन और ईमेल दोनों unique सत्यापन किया है) निम्नलिखित है:कारखाने की लड़की कब डीबी में वस्तुएं बनाती है?

Factory.define :user do |u| 
u.login 'quentin' 
u.email '[email protected]' 
end 

Factory.define :session_user, :class => Session do |ses| 
ses.association :user, :factory => :user 
ses.session_id 'session_user' 
end 

और यहाँ परीक्षण

class MessagesControllerTest < ActionController::TestCase 

context "normal user" do 
    setup do 
    @request.session[:user_id]=Factory(:user).id 
    @request.session[:session_id]=Factory(:session_user).session_id 
    end 

    should "be able to access new message creation" do 
    get :new 
    assert_response :success 
    end 
end 
end 

है, लेकिन जब मैं rake test:functionals चलाने के लिए, मैं इस परीक्षा परिणाम प्राप्त

1) Error: 
    test: normal user should be able to access new message creation. (MessagesControllerTest): 
    ActiveRecord::RecordInvalid: Validation failed: Account name already exists!, Email already exists! 

जिसका अर्थ है कि डीबी में रिकॉर्ड पहले से मौजूद है जब मैं परीक्षण सेटअप में इसका जिक्र कर रहा हूं। क्या मुझे कुछ समझ में नहीं आता है? FactoryGirl स्टार्टअप पर डीबी में सभी कारखानों का निर्माण करता है?

रेल 2.3.5/चाहिये/FactoryGirl

उत्तर

36

Factory(:user)Factory.create(:user) तो अपने स्थापना के भीतर आप दो वस्तुओं बनाने और उन्हें डेटाबेस के लिए बचत कर रहे हैं के लिए एक शॉर्टकट है।

Factory.build(:user) आपको डीबी को सहेजे बिना user रिकॉर्ड बनाएगा।

संपादित

अपने session_user कारखाने के भीतर आप एक उपयोगकर्ता का निर्माण कर रहे हैं और फिर अपने परीक्षण सेटअप के अंतर्गत एक दूसरे का निर्माण। FactoryGirl एक नया user रिकॉर्ड बनाएगा क्योंकि आपके पास session_user फैक्ट्री में सहयोग है।

आप या तो इस प्रकार session_user वस्तु से अपने user उदाहरण मिल सकते हैं: -

context "normal user" do 
    setup do 
    session = Factory(:session_user) 
    @request.session[:session_id] = session.session_id 
    @request.session[:user_id] = session.user_id 
    end 

या इस प्रकार आप user कारखाने के लिए कुछ विवरण जोड़ सकते हैं अद्वितीय नाम और ईमेल पते के लिए सुनिश्चित करें: -

Factory.define :user do |u| 
u.sequence(:login) {|n| "quentin#{n}" } 
u.sequence(:email) {|n| "quentin#{n}@example.com"} 
end 
+1

लेकिन मेरे पास मेरे कोड में केवल एक फैक्टरी (उपयोगकर्ता) का उल्लेख है। यह दो बार क्यों चलता है? (दूसरा फैक्टरी (: session_user) है, जो एक सत्र उदाहरण है) –

+0

क्षमा करें प्रश्न को पढ़ना चाहिए –

संबंधित मुद्दे