2009-09-26 14 views
6

मैं रेल यूनिट्स में सत्यापन का परीक्षण करने के लिए स्वच्छ और संक्षिप्त कोड की तलाश में हूं।परीक्षण सत्यापन त्रुटियों के लिए सरल वाक्यविन्यास

वर्तमान में मैं इस

test "create thing without name" do 
    assert_raise ActiveRecord::RecordInvalid do 
     Thing.create! :param1 => "Something", :param2 => 123 
    end 
end 

मुझे लगता है कि जैसे कुछ एक बेहतर तरीका है कि यह भी मान्यता संदेश से पता चलता है क्या ज़रूरत है?

समाधान:

एक अतिरिक्त व्यवस्थाएं बिना मेरे वर्तमान समाधान है:

test "create thing without name" do 
    thing = Thing.new :param1 => "Something", :param2 => 123 
    assert thing.invalid? 
    assert thing.errors.on(:name).any? 
end 
+0

धन्यवाद जवाब के लिए एस है। मैं rspec और दूसरों को कुछ समय कोशिश करेंगे। अभी के लिए मैं अपने आप को assert (record.invalid?) और assert_equal ([], record.errors.full_messages) – Roman

उत्तर

6

आप क्या परीक्षण ढांचे है कि आप प्रयोग कर रहे हैं उल्लेख नहीं है। कई में मैक्रोज़ होते हैं जो परीक्षण को सक्रिय करते हैं।

thing = Thing.new :param1 => "Something", :param2 => 123 
assert !thing.valid? 
assert_match /blank/, thing.errors.on(:name) 
+0

पर सहायता करता हूं, इस समय मैं केवल सादे रेल का उपयोग करता हूं। – Roman

+1

रेल 3 के रूप में ActiveModel :: त्रुटियों के लिए कोई "चालू" विधि नहीं है। http://stackoverflow.com/questions/7526499/undefined-method-on-for-actionmodel –

+1

यह उत्तर दिनांकित किया जा सकता है, लेकिन 'assert_match' किसी सरणी पर काम नहीं करता है। –

0

आप एक कोशिश दे सकता है rspec-on-rails-matchers:

यहाँ "लंबा रास्ता तय करना" किसी भी परीक्षा सहायकों का उपयोग किए बिना यह करने के लिए है। वाक्य रचना के साथ आप प्रदान करता है जैसे:

@thing.should validates_presence_of(:name) 
+0

पृष्ठ कहता है: मुझे उपयोग न करें। मैं पुराना हूं और मैं कंधे तोड़ता हूं। कंधे अब rspec के साथ काम करता है। उसका उपयोग करें। – Roman

1

मैं रेल 2.0.5 का उपयोग कर रहा वास्तव में जटिल सत्यापन परीक्षण कर सकते हैं, और जब मैं बात पर जोर देना चाहते हैं कि एक मॉडल असफल हो जायेगी सत्यापन, मैं errors.full_messages method की जांच करता हूं, और इसकी तुलना अपेक्षित संदेशों की एक सरणी से करता हूं।

created = MyModel.new 
created.field1 = "Some value" 
created.field2 = 123.45 
created.save 

assert_equal(["Name can't be blank"], created.errors.full_messages) 

बात पर जोर देना है कि सत्यापन सफल होता है, मैं सिर्फ एक खाली सरणी के लिए की तुलना करें। आप यह जांचने के लिए कुछ ऐसा ही कर सकते हैं कि एक रेल नियंत्रक के पास कोई निर्माण या अद्यतन अनुरोध के बाद कोई त्रुटि संदेश नहीं है।

def assert_invalid(record, options) 
    assert_predicate record, :invalid? 

    options.each do |attribute, message| 
    assert record.errors.added?(attribute, message), "Expected #{attribute} to have the following error: #{message}" 
    end 
end 

कौन सा अनुमति देता है:

assert record.errors.added? :name, :blank 

मैं एक परीक्षण सहायक है कि इस तरह दिखता है का उपयोग करें:

assert_difference('MyModel.count') do 
    post :create, :my_model => { 
    :name => 'Some name' 
    } 
end 

assert_equal([], assigns(:my_model).errors.full_messages) 
assert_redirected_to my_model_path(assigns(:my_model)) 
1

उन रेल का उपयोग कर 3.2.1 के लिए और ऊपर, मैं added? विधि का उपयोग कर पसंद करते हैं मुझे इस तरह के परीक्षण लिखने के लिए:

test "should be invalid without a name" do 
    user = User.new(name: '') 

    assert_invalid user, name: :blank 
end 
संबंधित मुद्दे