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
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:
- Her zamanki gibi bir geçiş oluşturun
- 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')
- 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. - 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
Raylar nasıl bir dosya upload test ede...
Nasıl bir dizi belirli bir değeri vars...
Nasıl bir dize Amaç C boşsa test edebi...
Objective-C, nesne türü nasıl test ede...
Nasıl bir değişkeni bash bir sayı ise ...