2011-02-22 12 views
6

मैं इन दिनों rspec में हूं, मेरे मॉडल को अधिक सटीक और सटीक बनाने की कोशिश कर रहा हूं। आरएसपीईसी के बारे में कुछ चीजें अभी भी मेरे लिए थोड़ा अजीब हैं और इसलिए मैंने सोचा कि अगर कोई स्पष्टीकरण दे तो यह अच्छा होगा।रुपयेपेक रेल - नाम मान्य होना चाहिए - कुछ स्पष्टीकरण

मान लें कि मेरे पास एक उपयोगकर्ता मॉडल है। इस के पास एक है: नाम। नाम 4..15 वर्णों के बीच होना चाहिए (यह एक माध्यमिक उद्देश्य है, पहले यह केवल अस्तित्व में होना चाहिए)। तो अब मैं सोच रहा हूं: इस तरह परीक्षण करने का सबसे अच्छा तरीका क्या है कि यह सुनिश्चित करेगा कि यह होगा।

describe User do 
    let(:user) { User.new(:name => 'lele') } 

    it "is not valid without a name" do 
     user.name.should == 'lele' 
    end 
end 

अब, मैं काफी यकीन है कि यह वास्तव में मैं क्या चाहते सिद्ध नहीं कर रहा हूँ: परीक्षण करने के लिए है कि एक उपयोगकर्ता एक नाम होना आवश्यक है, मैं कुछ इस तरह लिखा था। ऐसा लगता है कि मैं वास्तव में इस के साथ रेल का परीक्षण कर रहा हूं। इसके अलावा, अगर मैं यह जांचना चाहता हूं कि एक नाम 15 से अधिक वर्ण और 4 से कम नहीं हो सकता है, तो यह कैसे एकीकृत किया जा सकता है?

संपादित करें:

शायद यह बेहतर है?

describe User do 
    let(:user) { User.new(:name => 'lele') } 

    it "is not valid without a name" do 
     user.name.should_not be_empty 
    end 

end 

उत्तर

5

मैं इस तरह का उपयोग करें:

describe User do 

    it "should have name" do 
    lambda{User.create! :name => nil}.should raise_error 
    end 

    it "is not valid when the name is longer than 15 characters" do 
    lambda{User.create! :name => "im a very looooooooong name"}.should raise_error 
    end 

    it "is not valid when the name is shorter than 4 characters" do 
    lambda{User.create! :name => "Tom"}.should raise_error 
    end  
end 
+1

ध्यान दें कि सभी .create! विधियों ने डेटाबेस को मारा और परीक्षण ~ 100x गुना धीमा कर दिया। आप धीमेपन से बच सकते हैं और अभी भी @Dylan Markow के निर्देशों का उपयोग करके वैधता की जांच कर सकते हैं। – aaandre

15

आप शायद be_valid मिलान के लिए देख रहे:

describe User do 
    let(:user) { User.new(:name => 'lele') } 

    it "is valid with a name" do 
    user.should be_valid 
    end 

    it "is not valid without a name" do 
    user.name = nil 
    user.should_not be_valid 
    end 
end 
2

मैं सत्यापन के लिए वास्तविक त्रुटि संदेश का परीक्षण करना चाहते:

require 'spec_helper' 

describe User do 
    let (:user) { User.new } 

    it "is invalid without a name" do 
    user.valid? 
    user.errors[:name].should include("can't be blank") 
    end 

    it "is invalid when less than 4 characters" do 
    user.name = "Foo" 
    user.valid? 
    user.errors[:name].should include("is too short (minimum is 4 characters)") 
    end 

    it "is invalid when greater than 15 characters" do 
    user.name = "A very, very, very long name" 
    user.valid? 
    user.errors[:name].should include("is too long (maximum is 15 characters)") 
    end 

end 

किसी ऐसे फैक्ट्री का उपयोग करना भी सहायक होता है जो वैध गुणों वाला ऑब्जेक्ट बनाता है, जिसे आप परीक्षण के लिए एक समय में अमान्य कर सकते हैं।

+0

बहुत दिलचस्प दृष्टिकोण, thanx – Spyros

0

मैं कुछ इसी तरह का प्रयोग करेंगे इस

class User < ActiveRecord::Base 
    validates_presence_of :name 
    validates_length_of :name, :in => 4..15 
end 


describe User do 
    it "validates presence of name" do 
    user = User.new 
    user.valid?.should be_false 
    user.name = "valid name" 
    user.valid?.should be_true 
    end 

    it "validates length of name in 4..15" do 
    user = User.new 
    user.name = "123" 
    user.valid?.should be_false 
    user.name = "123456789" 
    user.valid?.should be_false 
    user.name = "valid name" 
    user.valid?.should be_true 
    end 
end 

सबसे उल्लेखनीय है कि मैं दोनों स्थितियों के लिए सक्रिय रिकॉर्ड सत्यापन का उपयोग कर रहा है। मेरे उदाहरणों में मैं त्रुटि तारों पर भरोसा नहीं करता हूं। उदाहरणों में जो मान्यताओं के व्यवहार का परीक्षण करते हैं, डेटाबेस को स्पर्श करने का कोई कारण नहीं है, इसलिए मैं नहीं करता हूं। प्रत्येक उदाहरण में मैं ऑब्जेक्ट के व्यवहार का परीक्षण करता हूं जब यह मान्य और अमान्य दोनों होता है।

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