SORU
21 Mayıs 2011, CUMARTESİ


Nasıl Raylar göçler test edebilirim?

Belirli koşullar yazdım bir geçiş çalıştırdıktan sonra tutun test etmek istiyorum. Yapmak için geçerli en iyi yolu nedir?

Bu beton: bir model için bir sütun ekler ve varsayılan değer veren bir geçiş yaptım. Ama bu model önceden varolan tüm örnekleri yeni sütun için varsayılan değer güncellemek için unuttum. Benim mevcut testlerin hiçbiri hepsi temiz bir veritabanı ile başlar ve varsayılan sağlayacak yeni bir veri Ekle çünkü bunu fark edecek. Ama eğer üretim için çekersem şeyler kırılacak biliyorum, ve benim testleri bana söylemeni istiyorum.

http://spin.atomicobject.com/2007/02/27/migration-testing-in-rails/ buldum ama denemedim. Çok eski. O-of-the-art devlet mi?

CEVAP
14 NİSAN 2012, CUMARTESİ


Peter Marklund burada bir geçiş test örnek bir etkiye sahiptir: https://gist.github.com/700194 (rspec).

Not göçler onun örneğini beri örnek sınıf yöntem yerine yöntemlerin kullanımı değişti.

İşte özeti:

  1. Her zamanki gibi bir geçiş oluşturun
  2. Bir dosya geçiş test koymak oluşturun. Öneriler: test/unit/import_legacy_devices_migration_test.rb spec/migrations/import_legacy_devices_migration_spec.rb NOT: muhtemelen açıkça raylar muhtemelen sizin için yük olarak göç dosyasını yüklemeniz gerekir. Bunun gibi bir şey: require File.join(Rails.root, 'db', 'migrate', '20101110154036_import_legacy_devices')
  3. Geçişler var (her şey ruby gibi), sadece bir sınıf. Test up down yöntemleri. Eğer mantığınız karmaşık, daha kolay olacak küçük yöntemlerine mantık parçaları yeniden düzenleme test yapmanızı öneririm.
  4. Sonra ne bekliyoruz up, önce geçiş olacağı gibi bazı veri seti ve devlet olduğunu iddia çağırmadan önce.

Bu yardımcı olur umarım.

GÜNCELLEMEBu fotoğrafları koyduktan sonra, benim blog example migration test. Bir ben yayınlanmıştır

GÜNCELLEMEBurada gelişme çalıştırılmış olsalar bile, test geçişleri için bir fikir.

EDİTBenim kavram kanıtı tam kapsamlı bir dosya blog yazıma gelen yapmacık örneği için güncelledik.

# spec/migrations/add_email_at_utc_hour_to_users_spec.rb
require 'spec_helper'

migration_file_name = Dir[Rails.root.join('db/migrate/*_add_email_at_utc_hour_to_users.rb')].first
require migration_file_name


describe AddEmailAtUtcHourToUsers do

  # This is clearly not very safe or pretty code, and there may be a
  # rails api that handles this. I am just going for a proof of concept here.
  def migration_has_been_run?(version)
    table_name = ActiveRecord::Migrator.schema_migrations_table_name
    query = "SELECT version FROM %s WHERE version = '%s'" % [table_name, version]
    ActiveRecord::Base.connection.execute(query).any?
  end

  let(:migration) { AddEmailAtUtcHourToUsers.new }


  before do
    # You could hard-code the migration number, or find it from the filename...
    if migration_has_been_run?('20120425063641')
      # If this migration has already been in our current database, run down first
      migration.down
    end
  end


  describe '#up' do
    before { migration.up; User.reset_column_information }

    it 'adds the email_at_utc_hour column' do
      User.columns_hash.should have_key('email_at_utc_hour')
    end
  end
end

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Sean Murphy

    Sean Murphy

    4 ŞUBAT 2009
  • THE RED DRAGON

    THE RED DRAG

    6 ŞUBAT 2009
  • wwjoshdu

    wwjoshdu

    18 ŞUBAT 2011