2016-04-14 24 views
0

Yayınlar tablosunda kendi kendine birleştirme olduğunda makale çevirileri oluşturmak için bir sistemi test etmeye çalışıyorum. Birden fazla çeviri oluşturacak ve bir 'ebeveyn' makalesiyle ilişkilendirecek bir fabrika oluşturdum.Fabrika Kız kendi kendine doğrulama onayı doğrulama kusurları

# models/publication.rb 

    has_many :translations, class_name: "Publication", foreign_key: "translation_id", dependent: :nullify 
    belongs_to :translation, class_name: "Publication", optional: true 

    validates :language, uniqueness: { scope: :translation_id }, if: :is_translation? 

    def is_translation? 
    !translation.nil? 
    end 
: factory_girl 4.7.0, RSpec ve Database_cleaner

Tüm eylemler beklendiği gibi çalışır, ancak bir test oluşturma sorun İşte

olduğu ile Rayları 5 Kullanılması

ilgili modeli doğrulamaları ve yöntemleri var

Fabrika (ilgisiz kod çıkartılmıştır):

# spec/factories/publication.rb 
    factory :publication, aliases: [:published_pub] do 
    title 'Default Title' 
    language 'EN' 
    published 

    after(:build) do |object| 
     create(:version, publication: object) 
    end 

    #-- This is where I suspect the problem stems from 

    trait :with_translations do 
     association :user, factory: :random_user 

     after(:build) do |object| 
     create_list(:translation, 3, {user: object.user, translation:object}) 
     end 
    end 
    end 

    factory :translation, class: Publication do 
    sequence(:title) { |n| ['French Article', 'Spanish Article', 'German Article', 'Chinese Article'][n]} 
    sequence(:language) { |n| ['FR', 'ES', 'DE', 'CN'][n]} 
    user 
    end 

ve bir bazik testi:

# spec/models/publication_spec.rb 
    before(:each) do 
     @translation_parent = create(:publication, :with_translations) 
     @pub_without_trans = create(:publication, :with_random_user) 
    end 

    scenario 'is_translation?' do 
     # No actual test code needed, this passes regardless 
    end 

    scenario 'has_translations?' do 
     # No actual test code needed, this (and subsequent tests) fail regardless 
    end 

Son olarak, hata:

Failure/Error: create_list(:translation, 3, {user: object.user, translation:object}) 

ActiveRecord::RecordInvalid: 
    Validation failed: Language has already been taken 

birinci test geçerse (ve çevirileri yayın nesne doğru oluşturulur), daha sonra hiçbir test başarısız olur. Sorun şu ki, çeviri_konu için benzersiz bir doğrulamaya sahibim ve fabrika kızının üretilen çevirileri, tamamen yeni bir yayın oluşturmak yerine halihazırda var olan bir yayına eklemeye çalıştığı anlaşılıyor.

Herhangi bir yardım için teşekkür ederiz!

cevap

0

Çözüldü!

Sorun, her testten sonra translation fabrikasındaki sekans yineleyicisinin 0'a sıfırlanmamasıydı. Yani test 1'den sonra, mevcut olmayan bir dizi indeksine erişmeye çalışıyordu. Bunu bir kez daha yaptıktan sonra, validasyonu tetikledi ve testler başarısız oldu!

çözüm tatlı değildi, ama şu an için yeterince iyi

sequence(:language) do |iteration| 
    array = ['FR', 'ES', 'DE', 'CN'] 
    # Returns a number between 0 and array.length 
    array[iteration%array.length] 
end 
sequence(:title) do |iteration| 
    array = ['French Article', 'Spanish Article', 'German Article', 'Chinese Article'] 
    # Returns a number between 0 and array.length 
    array[iteration%array.length] 
end 
İlgili konular