2012-12-22 23 views
5

मेरी रेल 3 आवेदन में, मैं एक RSpec कल्पना है कि गारंटी नहीं है कि मान मान्य मानों की सूची के भीतर है तो दिए गए फ़ील्ड (उपयोगकर्ता मॉडल में भूमिका) के व्यवहार की जांच करे।पुन: उपयोग RSpec व्यवहार सत्यापन

अब मेरे पास एक और मॉडल के लिए एक ही मॉडल है, जो वैध मानों के दूसरे सेट के साथ है। मैं चर को बदलने, प्रतिलिपि बनाने और चिपकाने के बजाय सामान्य कोड निकालना चाहता हूं।

मुझे आश्चर्य है कि यह साझा उदाहरण या अन्य आरएसपीसी पुन: उपयोग तकनीक का उपयोग करने का मामला होगा।

यहाँ प्रासंगिक RSpec कोड है:

describe "validation" do 
    describe "#role" do 
    context "with a valid role value" do 
     it "is valid" do 
     User::ROLES.each do |role| 
      build(:user, :role => role).should be_valid 
     end 
     end 
    end 

    context "with an empty role" do 
     subject { build(:user, :role => nil) } 

     it "is invalid" do 
     subject.should_not be_valid 
     end 

     it "adds an error message for the role" do 
     subject.save.should be_false 
     subject.errors.messages[:role].first.should == "can't be blank" 
     end 
    end 

    context "with an invalid role value" do 
     subject { build(:user, :role => 'unknown') } 

     it "is invalid" do 
     subject.should_not be_valid 
     end 

     it "adds an error message for the role" do 
     subject.save.should be_false 
     subject.errors.messages[:role].first.should =~ /unknown isn't a valid role/ 
     end 
    end 
    end 
end 

सबसे अच्छा मामले इस कोड को पुन: उपयोग करने के लिए, लेकिन भूमिका (क्षेत्र सत्यापित किया जा रहा है) और उपयोगकर्ता :: भूमिका (के संग्रह निकालने होगा क्या वैध मान) इस कोड में पारित पैरामीटर में?

shared_examples "no role" do 
    it "is invalid" do 
     subject.should_not be_valid 
    end 
    end 

    context "with an empty role" do 
    subject { Factory.build(:user, :name => nil) } 
    it_behaves_like "no role" 
    end 

    context "with an invalid role value" do 
    subject { Factory.build(:user, :name => '') } 
    it_behaves_like "no role" 
    end 

लेकिन क्या अपने विचार के बारे सुखाने के लिए कुछ specs..I लगता है कि यह बहुत ज्यादा है:

उत्तर

2

मुझे लगता है कि यह साझा उदाहरणों के लिए एक बिल्कुल उचित उपयोग केस है। जैसे कुछ इस तरह:

shared_examples_for "attribute in collection" do |attr_name, valid_values| 

    context "with a valid role value" do 
    it "is valid" do 
     valid_values.each do |role| 
     build(:user, attr_name => role).should be_valid 
     end 
    end 
    end 

    context "with an empty #{attr_name}" do 
    subject { build(:user, attr_name => nil) } 

    it "is invalid" do 
     subject.should_not be_valid 
    end 

    it "adds an error message for the #{attr_name}" do 
     subject.save.should be_false 
     subject.errors.messages[attr_name].first.should == "can't be blank" 
    end 
    end 

    context "with an invalid #{attr_name} value" do 
    subject { build(:user, attr_name => 'unknown') } 

    it "is invalid" do 
     subject.should_not be_valid 
    end 

    it "adds an error message for the #{attr_name}" do 
     subject.save.should be_false 
     subject.errors.messages[attr_name].first.should =~ /unknown isn't a valid #{attr_name}/ 
    end 
    end 
end 

तो फिर तुम इस तरह से अपनी ऐनक में यह कॉल कर सकते हैं:

describe "validation" do 
    describe "#role" do 
    behaves_like "attribute in collection", :role, User::ROLES 
    end 
end 

इस परीक्षण नहीं किया है, लेकिन मुझे लगता है कि यह काम करना चाहिए।

+0

कमाल, धन्यवाद। – kolrie

2

आप इस तरह से shared_examples कलाओं के साथ अपने कल्पना सुखा सकता। मुझे विश्वास है कि कल्पना को पहले पढ़ने योग्य और केवल तब ही ड्रैइंग करना होगा। यदि आप कुछ चश्मा ड्रॉ करते हैं, तो शायद यह कोड पढ़ने/रीफैक्टरिंग/इस कोड को बदलने के लिए सिरदर्द होगा।

+0

सहमत हुए। मैं या तो ऐसा करने का एक अच्छा तरीका ढूंढ रहा था या कोई वास्तव में मुझे बता रहा था कि आपने अभी क्या किया है। मैं कॉपी और पेस्ट और छोटे टुकड़े ड्रवाई करेंगे। धन्यवाद। – kolrie

+0

क्या यह 'shared_examples_for' नहीं होना चाहिए और' shared_examples' नहीं होना चाहिए? –

+0

'shared_examples' काम करेगा – alex