2011-09-23 19 views
9

मुझे कुछ अजीब सत्यापन व्यवहार मिल रहा है: यह मेरे सत्यापन त्रुटि संदेशों को डुप्लिकेट कर रहा है और मैं यह नहीं समझ सकता कि इसका कारण क्या है ... यह रेल कंसोल में ऐसा नहीं करता है ।रेल 3: परीक्षण के दौरान डुप्लिकेट सत्यापन त्रुटि संदेश

यहाँ मेरी फोन मॉडल से मान्यता है:

# phone.rb 
validates :number, :length => { :minimum => 3 } 

मेरे कल्पना:

require 'spec_helper' 

describe Phone do 
    it "requires a number" do 
    user = User.make! 
    @p = Phone.new(number:nil,user_id:user.id,type:2) 
    @p.valid? 
    puts @p.errors.inspect 
    @p.should have(1).error_on(:number) 
    end 

मेरे परीक्षण के परिणाम:

# rspec and machinist 
#<ActiveModel::Errors:0x000000036f1258 @base=#<Phone id: nil, user_id: 614, kind: nil, number: nil, created_at: nil, updated_at: nil>, @messages={:number=>["is too short (minimum is 3 characters)", "is too short (minimum is 3 characters)"]}> 
F 

Failures: 

    1) Phone requires a number 
    Failure/Error: @p.should have(1).error_on(:number) 
     expected 1 error on :number, got 2 
    # ./spec/models/phone_spec.rb:11:in `block (2 levels) in <top (required)>' 

Finished in 0.50988 seconds 
1 example, 1 failure 

आप देख सकते हैं, मैं हो रही है "बहुत छोटा है (न्यूनतम 3 वर्ण है)" दो बार ... यह परीक्षण के दौरान/केवल/हो रहा है। कोई विचार?

धन्यवाद!

+0

आपकी एसोसिएशन परिभाषाएं क्या दिखती हैं और क्या आप validates_associated का उपयोग करते हैं? –

+0

फ़ोन में, यह 'है_ऑन: उपयोगकर्ता ', और उपयोगकर्ता में, यह' है_मनी: फोन'। मैंने अपने validatons का परीक्षण करने के लिए 'valid_attribute' मणि का उपयोग शुरू किया, और यह इस विधि से काफी अच्छा है। – wulftone

+0

क्या आपको कोई समाधान मिला? – MrEvil

उत्तर

9

समस्या कतार में है:,

Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f } 
spec_helper.rb फ़ाइल में

Spork.each_run ब्लॉक में

यदि आप 'लोड' विधि को 'आवश्यकता' में बदलते हैं, तो यह समस्या को हल करता है।

या यदि आपके पास स्पार्क का हालिया संस्करण है, तो आप पूरी तरह से लाइन को हटा सकते हैं।

Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f } 

भी spec_helper में स्पष्ट रूप से कहा गया है करने के लिए नहीं है जा: मैं क्योंकि लाइन यकीन है कि त्रुटि के कारण होता है जब किसी एक नए संस्करण Spork (0.9.0+) वर्ष के निर्देश के साथ स्थापित करने रहा है, अब आरआरबी फ़ाइल। यदि ऐसा तब होता है जब spec_helper.rb फ़ाइल में लोड विधि का उपयोग किया जाता है, तो यह निर्दिष्ट फ़ाइलों को पुनः लोड करता है, अधिकतर अजीब RSpec डुप्लिकेट सत्यापन त्रुटियों का कारण।

+0

पर मेरे लिए काम किया, धन्यवाद –

+0

बहुत से लोगों ने इस के लिए मतदान किया, मैं इसे उत्तर के रूप में चिह्नित करने जा रहा हूं (मैंने लंबे समय तक स्पार्क का उपयोग नहीं किया है)। – wulftone

0

मुझे यकीन नहीं है कि यह आपकी समस्या का समाधान करने जा रहा है, लेकिन यदि आप आरएसपीईसी सम्मेलन का पालन नहीं करते हैं तो आरएसपीईसी बहुत क्विर्की है। निम्नलिखित की तरह कुछ और मुहावरेदार rspec का प्रयास करें:

की आवश्यकता होती है 'spec_helper'

describe Phone do 
    context :validations do 
    let(:user) { double(:user) } 
    subject { Phone.new(number:nil,user_id:user.id,type:2) } 

    before do 
     subject.valid? 
    end 

    it 'should have a minimum length of 3' do 
     subject.should have(1).error_on(:number) 
    end 
    end 
end 

मैं भी सुझाव देना चाहते हैं कि आप चाहिए नहीं इकाई परीक्षण रेल 'सत्यापन में बनाया; वे पहले से ही रेल में परीक्षण कर रहे हैं। विशेष रूप से, आपकी लंबाई सत्यापन का परीक्षण activemodel/test/cases/validations/length_validation_test.rb में किया जाता है। सत्यापन के व्यवहार को आपके एकीकरण परीक्षणों में शामिल किया जाना चाहिए।

मुझे आशा है कि यह सहायक होगा।

+0

कूल, इसके लिए धन्यवाद। यूनिट परीक्षण मान्यताओं के लिए बिंदु (मेरे लिए) _ हर जल्दी/श्वेतसूची/उन चीज़ों को ब्लैकलिस्ट करना है जिनकी आप परवाह करते हैं/परवाह नहीं करते हैं (एकीकरण परीक्षण यूनिट परीक्षण के जितना तेज़ नहीं होते हैं!), और valid_attribute मणि इस के लिए बहुत अच्छा काम करता है ... लेकिन, संदर्भ के लिए, उपरोक्त उदाहरण सीधे मॉडल सत्यापन पर आरएसपीसी वेबसाइट के उदाहरण से लिया गया था: https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/model-specs/errors- – wulftone

0

मुझे एक ही समस्या है (rspec & स्पार्क का उपयोग कर)।

मुझे संदेह है कि मॉडल को दो बार आवश्यक होने के साथ कुछ करना है, जिससे सत्यापन दो बार चल सकता है।

यदि आप अपने spec के शीर्ष पर require 'phone' की व्याख्या करते हैं, तो यह ठीक लगता है।

लेकिन मैं सच में पता है कि समस्या खड़ी कर रहा है चाहता हूँ ...

1

मैं डुप्लिकेट त्रुटि संदेशों में से एक समान मुद्दे का सामना करना पड़ा है, लेकिन यह मानक, जैसे तुलना में एक अलग निर्देशिका संरचना के अपने प्रयोग के कारण उत्पन्न होती लग रहा था:

- app 
    \- models_one 
    |- models_two 
    |- models_three 

मेरे load/requireSpork.each_run ब्लॉक में कॉल देखा इस तरह:

Dir["#{Rails.root}/app/models_*/*.rb"].each { |f| load f } 

मैं इस निकाल दिया है और इन से बदल दिया:

ActiveSupport::Dependencies.clear 
ActiveRecord::Base.instantiate_observers 

और कोई और डुप्लिकेट त्रुटि संदेश नहीं थे।

मुझे इस पोस्ट द्वारा सहायता मिली: http://adams.co.tt/blog/2012/04/12/duplicate-active-model-validation-errors/ जिसमें लेखक कहता है कि यह एक 1.8.7-विशिष्ट समस्या है जिसमें एक ही फ़ाइल को हल करने वाले विभिन्न पथों की आवश्यकता होती है, लेकिन मैं 1.9.3 का उपयोग कर रहा हूं, इसलिए यह संबंधित नहीं हो सकता है ।

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