FixtureReplacement fixture'lardaki dezavantajları ortadan kaldırır. FixtureReplacement naıl kullanıldığını merak ediyorsanız "http://github.com/smtlaissezfaire/fixture-replacement-git/tree/master":http://github.com/smtlaissezfaire/fixture-replacement-git/tree/master adresindeki readme'ye bir göz atın derim. Çok basit bir kullanımı olduğunu göreceksiniz.
Geçenlerde FixtureReplacement kullanırken bir sorunla karşılaştık ama basit bir alternatif yöntem kullanarak bu sıkıntıyı aştık. Problem FixtureReplacement'ın primary key'i olmayan bir tablo için 'create' methodunun çalışmamasıydı. Diğer bir deyişle eğer tablonuzda bir 'id' alanı yok veya modelinizde 'set_primaty_key' ile bir alanı primary key olarak seçmediyseniz ActiveRecord'ın 'create' methodunu kullanan FixtureReplacement bu yüzden hata veriyor. Örneğin,
Kedi tablomuz olsun ve alanları şöyle olsun:
ad, cins, goz_rengi, tuy_rengi, kilo
Bu modeli FixtureReplacement sunduğu yöntemle (create_model) şu şekilde yaratmaya çalışalım
create_kedi(
:ad => "Sarman",
:cins => "tekir",
:tuy_rengi => "sarı",
:goz_rengi => "ela",
:kilo => "6"
)
Sonuç aşağıdaki hata gibi olacaktır.
ActiveRecord::StatementInvalid: PGError: ERROR: column "id" does not exist
Bunu şu şekilde de denesek sonuç aynı olurdu
Kedi.create(
:ad => "Sarman",
:cins => "tekir",
:tuy_rengi => "sarı",
:goz_rengi => "ela",
:kilo => "6"
)
veya
kedi = Kedi.new(
:ad => "Sarman",
:cins => "tekir",
:tuy_rengi => "sarı",
:goz_rengi => "ela",
:kilo => "6"
)
kedi.save
Doğrudan SQL kullandığımız zaman bu problemin ortadan kalktığını görüyoruz
sql = "INSERT INTO kedi (ad, cins, goz_rengi, tuy_rengi, kilo) VALUES ('Sarman', 'tekir', 'ela', 'sarı', 6)"
ActiveRecord::Base.connection.execute(sql)
h2. Sonuç
FixtureReplacement kullanıyor ve primary key olmayan bir tablonuz varsa create_model (model yerine kendi modellerinizden birini düşünün create_kedi gibi) metodunu kullanamazsınız. Bunun yerine doğrudan SQL çalşıtırmanız testleriniz sırasında size bir çözüm sağlayacaktır.