2017-02-10 5 views
8

प्रसंग

हम रेल से 3.2.12 4.0.2 करने के लिए और रूबी 1.9.3 2.1.8 की ओर पलायन कर रहे हैं।रेल 3 से 4 प्रवास विशिष्टता सत्यापन संबंधी समस्याएं

हमारे पास आरएसपीसी के रूप में माइग्रेशन को पूरा करने के लिए बहुत से परीक्षण कवरेज हैं।

अंक

कल्पना है कि जाँच करता है कि एक कार्ड के मॉडल पर एक विशिष्टता सत्यापन विफल हो रहा है में से एक।

validates :mobile, uniqueness: {scope: :program_member_id, message: I18n.t('models.card.error.cardholder_already_has_mobile')}, if: :mobile 

जहां एक program_member केवल एक mobile: true कार्ड हो सकता है।

spec सदस्य के लिए 2 कार्ड बनाता है, एक मोबाइल कार्ड में बदल जाता है, फिर दूसरे कार्ड के साथ ऐसा करने पर सत्यापन के संदेश की अपेक्षा करता है।

let(:program) { FactoryGirl.create(:program) } 
let(:card) { FactoryGirl.create(:card, program: program) } 

context 'when cardholder already has a mobile card' do 
    it 'fails validation' do 
    card2 = FactoryGirl.create(:card, program: program) 
    program_member_user = FactoryGirl.create(:program_member_user, card_number: card2.cardnumber) 
    program_member = program_member_user.program_members.first 

    program_member.cards << card2 
    card2.update_attributes(:mobile => true) 

    program_member.cards << card 
    card.update_attributes(:mobile => true) 

    expect(card.errors.messages).to include(:mobile=>[I18n.t('models.card.error.cardholder_already_has_mobile')]) 
    end 
end 

उम्मीद:

expected {} to include {:mobile=>["Cardholder already has a mobile card"]} 

जब मैं हमारे master शाखा में जाते हैं, इस कल्पना से गुजरता है।

असफल होने के लिए काम कर रहे इस spec से बदल गया एकमात्र कारक रेल 3 से 4 माइग्रेशन है।

केवल कंसोल में spec कोड चलाने का प्रयास करने के लिए सदस्य के पास 2 मोबाइल कार्ड हैं और card.valid? दोनों उदाहरणों के लिए true लौटाते हैं।

प्रश्न

कुछ भी विशिष्टता सत्यापन या सत्यापन जीवन चक्र के संबंध में रेल 4 में परिवर्तित किया गया?

+0

क्या आप पूर्णता के लिए 'register_card' क्या साझा करते हैं, साझा करना चाहते हैं? –

+0

@JanKlimo मैंने एक प्रोग्राम_member_user को कार्ड असाइन करने के लिए निष्पादित वास्तविक कोड को प्रतिबिंबित करने के लिए प्रश्न को अद्यतन किया है।यहां तक ​​कि जब मैं कंसोल में मैन्युअल रूप से सबकुछ जोड़ता हूं, तब भी मुझे काम करने के लिए सत्यापन नहीं मिल सकता है। सत्यापन की स्थिति को हटाने से भी कोई प्रभाव नहीं पड़ता है (यानी, गैर-मोबाइल कार्ड के लिए विशिष्टता के लिए सत्यापन करना)। – fbelanger

+0

हम्म, बहुत अजीब है क्योंकि मुझे आपके कोड में कोई समस्या नहीं दिख रही है। मैंने आपकी समस्या के सरलीकृत संस्करण के साथ एक परीक्षण रेपो बनाया लेकिन समान सत्यापन। यदि आप इसे क्लोन करते हैं और rspec चलाते हैं, तो परीक्षण पास हो जाता है? https://github.com/janklimo/TestUniquenessApp –

उत्तर

1

ठीक है तो मैं कुछ पर हूं।

मैंने उसी रूबी और रेल संस्करण का उपयोग करके एक परीक्षण प्रोजेक्ट बनाया है।

https://github.com/frank184/test_uniquness

इस परियोजना में, मैं एक User मॉडल एक ऐसी ही मान्यता के साथ एक बूलियन के रूप में एक admin स्तंभ है कि होगा।

validates_uniqueness_of :admin, if: :admin? 

मैंने इच्छित परिणाम का वर्णन करने के लिए कंधे-मैचर्स और आरएसपीईसी का उपयोग किया।

require 'rails_helper' 

RSpec.describe User, type: :model do 
    let(:user) { build :user } 
    subject { user } 

    describe 'validations' do 
    context 'when admin = true' do 
     before(:each) { user.admin = true } 
     it { is_expected.to validate_uniqueness_of(:admin) } 
    end 
    end 
end 

कल्पना निम्नलिखित उत्पादन के साथ विफल हुआ:

Failures: 

    1) User validations when admin = true should validate that :admin is case-sensitively unique 
    Failure/Error: it { is_expected.to validate_uniqueness_of(:admin) } 

     User did not properly validate that :admin is case-sensitively unique. 
     After taking the given User, whose :admin is ‹true›, and saving it as 
     the existing record, then making a new User and setting its :admin to 
     ‹true› as well, the matcher expected the new User to be invalid, but 
     it was valid instead. 
    # ./spec/models/user_spec.rb:10:in `block (4 levels) in <top (required)>' 

Finished in 0.11435 seconds (files took 0.79997 seconds to load) 
1 example, 1 failure 

मैंने तय कर लिया है कि कोड अच्छा था और वास्तव में 4.1.0 के लिए रेल छोड़।

spec पास हो गया!

bundle update 
rspec 
. 

Finished in 0.09538 seconds (files took 1.28 seconds to load) 
1 example, 0 failures 
+0

ध्यान दें कि 'is_expected'' विषय' पर काम करता है, इसलिए आपको 'विषय' के साथ अपने चश्मे में 'उपयोगकर्ता' को प्रतिस्थापित करना चाहिए और देखें कि यह अभी भी काम करता है या नहीं। –

+0

उपरोक्त 'वर्णन' सत्यापन 'देखें' देखें। – fbelanger

+0

तो आप बस ठीक कर रहे हैं। एक उत्तर में अपना समाधान जोड़ें और इसे स्वीकार करें ताकि यह अन्य लोगों की मदद कर सके। :) –

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