2013-07-18 7 views
7

का उपयोग कर एक निश्चित आईडी के साथ एक मॉडल बनाने के लिए मैं का उपयोग करें:rspec और कारखाने महिला

gem 'rails', '3.2.11' 
gem 'rspec-rails', '2.13.2' 
gem 'webrat', '0.7.3' 
gem 'factory_girl_rails', '4.1.0' 
gem 'spork', '~> 0.9.0.rc' 

मैं अपने अश्वशक्ति परीक्षण करने के लिए जहां मैं हमेशा एक निश्चित उपयोगकर्ता के लिए एक लिंक करना चाहते हैं, तो हिमाचल प्रदेश के लिए पृष्ठों नियंत्रक शामिल हैं:

@user = User.find(7) 

और दृश्य हिमाचल प्रदेश शामिल हैं:

link_to 'See user', @user 

समस्या सभी परीक्षणों के बाद से परीक्षण डेटाबेस कोई यू है असफल है कि है आईडी 7 के साथ सीर। मैंने कोशिश की:

FactoryGirl.define do 
    factory :user do 
    name "Testuser" 
    id "7" 
    end 
end 

... लेकिन यह काम नहीं करता है।

describe "GET 'home'" do 

    before(:each) do 
     FactoryGirl.create(:user) 
    end 

    it "should be successful" do 
     get 'home' 
     response.should be_success 
    end 
end 

विफलता/त्रुटि::

कल्पना यह है: वहाँ हमेशा त्रुटि है आईडी = 7

साथ उपयोगकर्ता नहीं मिल सका: 'घर' ActiveRecord :: RecordNotFound मिल एचपी वास्तविकता में ठीक काम कर रहा है, बस परीक्षण विफल रहता है। मैं कैसे आश्वस्त कर सकता हूं कि यह परीक्षण असफल नहीं होगा?

+1

मुझे यकीन नहीं है कि यह काम करेगा, लेकिन आईडी = 7 –

+0

आज़माएं क्या आप अपने असफल नमूने के लिए कोड जोड़ सकते हैं? –

+0

यदि आप उपयोगी मदद चाहते हैं तो अपने spec का कोड दिखाएं। अब तक हर कोई अनुमान लगा रहा है। – boulder

उत्तर

8

क्या मजाक/छोटा करते (बहुत तेजी से कल्पना जब डेटाबेस के लिए वस्तुओं की बचत नहीं) के बारे में:

let(:user) { FactoryGirl.build(:user) } 
let(:id) { '1' } 

before do 
    user.stub(:id).and_return(id) # just to illustrate, not necessary if stubbing the find class method 
    User.stub(:find).and_return(user) 
end 

it { expect(user.id).to eq(id) } # just to illustrate 
it { expect(response).to be_success } 
it { expect(assigns(:user)).to eq(user) } 

आप अभी भी उपयोगकर्ता के साथ समस्या है, तो केवल instantiated जा रहा है, यदि आप ऊपर तकनीक का उपयोग करें, लेकिन FactoryGirl.build(:user) जगह ले सकता है FactoryGirl.create(:user)

1

आप की तरह

before 
    u = FactoryGirl.create(:user) 
    u.update_attribute(:id, 7) 
end 

कुछ कर रही द्वारा एक उपयोगकर्ता की आईडी सेट कर सकते हैं हालांकि, इस एक छोटे से अजीब है। आप ऐसे मामले में भी जा सकते हैं जहां उपयोगकर्ता के 7 हैं।

हालांकि आप क्या कर सकते हैं, उचित उपयोगकर्ता प्राप्त करने के लिए रुपेक के स्टब्स का उपयोग करें।

@user = FactoryGirl.create(:user, :id => 7) 
+0

धन्यवाद। Update_attribute ने त्रुटि संदेश नहीं बदला ... मैं बाद में स्टब्स का उपयोग करने की कोशिश करूंगा ... – user929062

8

दस्तावेज की Using Factories खंड के आधार पर की तरह कुछ कर सकता है, मैं की तरह कुछ के साथ कल्पना अपने आप में id स्थापित करेगा। .. आपको संभवतः उस तरीके को नहीं लिखना चाहिए जिस तरह से आप इसे कर रहे हैं। अपने परीक्षण विशिष्ट आईडी पर निर्भर बनाना आपदा के लिए एक नुस्खा है

u=FactoryGirl.create(:user) 
User.where('id=?',u.id).count.should == 1 

:

अपने कल्पना में

की तरह कुछ है।

+1

यह तर्क लगता है, लेकिन मुझे अभी भी एक ही त्रुटि संदेश मिलता है। – user929062

+3

उन लोगों के लिए जो Google के माध्यम से यह प्रश्न पाते हैं। यह समाधान अब काम करता है (अगस्त 2015) – Benj

2

नहीं एक जवाब है, लेकिन एक suspicition: उदाहरण के लिए आप

let(:user_7) { FactoryGirl.create(:user) } 
before { User.stub(:find).with(7).and_return(user_7) } 
+0

मैं आपसे सहमत हूं। लेकिन समस्या यह है कि मेरे एचपी के पास इस विशिष्ट उपयोगकर्ता का एक लिंक है। इसलिए, जब मैं परीक्षण चलाता हूं तो त्रुटि यह है कि एचपी प्रस्तुत नहीं किया जाता है क्योंकि परीक्षण डेटाबेस में आईडी 7 वाला कोई उपयोगकर्ता नहीं है। यह मेरा एकमात्र परीक्षण है जो एक आईडी पर निर्भर करता है, लेकिन मुझे इससे बचने का कोई और तरीका नहीं दिखता है। – user929062

0

आपके मामले में मुझे यकीन है कि आप केवल यह जांच रहे हैं कि उपयोगकर्ता आईडी का उपयोग किसी विशिष्ट आईडी के बजाय किया जा रहा है।

जब मैं परीक्षण लिखता हूं तो मुझे बस डेटाबेस से लौटाया जाता है जो वास्तविकता में आप जो भी कर रहे हैं उससे कहीं अधिक भरोसेमंद और करीब है।

मैं इस तरह कुछ नियंत्रक spec लिखूंगा।

RSpec.describe MyController, type: :controller do 
    let(:user) { FactoryGirl.create(:user) } 
    before do 
    # login the user here which would resolve which user id is being used 
    sign_in user #assumes you are using warden test helpers 
    get :home 
    end 

    it "allows the user to the page" do 
    assert_response :ok 
    end 
end 

यह ठीक लोड होना चाहिए। यदि आप दोबारा जांचना चाहते हैं कि लिंक सही है तो आपको कैपिबरा जैसे कुछ का उपयोग करके feature spec में ऐसा करना चाहिए।