2017-02-10 64 views
8

Bağlam

Biz 3.2.12 4.0.2 ve Ruby 1.9.3 2.1.8 Raylar taşıma işleminin gerçekleştirileceği verir.Raylar 3 ila 4 göç benzersizliği doğrulama

RSpec biçiminde geçişi gerçekleştirmek için çok fazla test kapsamımız var.

Sayı Bir Kart modeline bir benzersizliği doğrulama başarısız olduğunu denetler spec

biri. Bir program_member tek mobile: true kartı olabilir

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

.

Bu özellik, üye için 2 kart oluşturur, birini bir mobil karta dönüştürür, ardından ikinci karta yaptığınızda doğrulama mesajını bekler.

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 

Beklenti:

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

bizim master şubesine gidip, bu teknik özellik geçer.

Bu belirtimden çalışmayan tek faktör, Rails 3'ten 4'e geçiştir.

Her iki örnekte de üye kodunu 2 cep kartına sahip olduğunu ve card.valid? öğesinin true değerini döndürerek konsolda çalıştırılmasını denedim.

Soru

şey benzersizliği doğrulama veya doğrulama yaşam döngüsünün açısından Raylar 4'te değişti mi?

+0

Tam olarak ne register_card'nın paylaştığını paylaşır mısınız? –

+0

@JanKlimo Sorunu, kartı bir program_member_user öğesine atamak için çalıştırılan gerçek kodu yansıtacak şekilde güncelledim.Her şeyi manuel olarak konsolda eklediğimde bile, doğrulama işleminin hala işe yaramayabilir. Doğrulama koşulunun kaldırılmasının bile bir etkisi yoktur (yani, mobil olmayan kartların benzersizliği için doğrulama gerçekleştirilir). – fbelanger

+0

Hmm, kodunuzda herhangi bir sorun görmediğimden çok garip. Probleminizin basitleştirilmiş bir versiyonunu, ancak aynı doğrulamayı içeren bir test repo oluşturdum. Kopyalayıp rspec'i çalıştırırsanız, test geçer mi? https://github.com/janklimo/TestUniquenessApp –

cevap

1

Pekala, öyle bir şey üzerinde yapıyorum.

Aynı Ruby ve Rails sürümünü kullanarak bir test projesi oluşturdum.

https://github.com/frank184/test_uniquness

Bu projede, benzer bir doğrulama ile ilgili bir mantıksal olarak bir admin sütunu olan bir User modeline sahip olacaktır.

validates_uniqueness_of :admin, if: :admin? 

İstenen sonucu tanımlamak için shoulda-matchers ve rspec kullandım.

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 

Spec aşağıdaki çıkışı ile başarısız oldu: Ben kodu iyi olduğuna karar verdi ve tam olarak 4.1.0 Rails çarptı

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 

.

Spesifikasyon geçti!

bundle update 
rspec 
. 

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

'' '_ '' 'konu' üzerinde' '' '' '' '' '' '' '' '' ile '' '' '' '' ''' ile' '' '' '' '' öznede '' yerine '' değiştirmelisiniz ve hala işe yarayıp yaramadığını görün. –

+0

Yukarıdaki ifadelere bakın 'validations' do' tanımlayın. – fbelanger

+0

Yani, gayet iyisin. Çözümünüzü bir cevaba ekleyin ve kabul edin, böylece diğer insanlara yardımcı olabilir. :) –