2013-10-06 25 views
9

kayıtlarını tutuyor Bir kullanıcı testini her çalıştırdığımda, Test tamamlandıktan sonra RSpec Test edilen veritabanını test tamamladıktan sonra diğer testlerimi bozuyor. Bir rake db:test:prepare yapacağım, ancak testlerimi tekrar çalıştırdığımda, kayıt veritabanımda yeniden oluşturulur. Bunun neden olduğu hakkında hiçbir fikrim yok. Sadece kullanıcı nesnelerinde olur. Benim spec_helper dosyasındaRSpec, test veritabanında

Hatta var:

it "creates a password reset token for the user" do 
    alice = Fabricate(:user) 
    post :create, email: alice.email 
    expect(assigns(alice.password_reset_token)).to_not eq(nil) 
end 

Fabrikatör:

Fabricator(:user) do 
    email { Faker::Internet.email } 
    password 'password' 
    name { Faker::Name.name } 
end 

bu ilgisi olabilir İşte

config.use_transactional_fixtures = true 

rekor oluşturan bir örnek testtir Kullanıcılarımın modeli ile yapmak?

cevap

0

Tahmin etmem gerekirse, post :create, email: alice.email hattı, gerçek kullanıcı oluşturma işlemini gerçekleştirme olasılığı yüksek gibi görünüyor.

Stub, sahte bir sınama ile sıraya giriyor ve hala DB'de bir kullanıcı oluşturduysanız bakın.

4

Her sınama bir veritabanı işlemine sarılır. Bu test sırasında oluşturulan her şeyin test bittiğinde gitmesi gerektiği anlamına gelir. Bu nedenle, veritabanınızdaki her ne olursa olsun, testin dışında (before(:all) bloğunda olduğu gibi) şüphelenirim.

Ayrıca bu, testlerinizi her çalıştırdığınızda veritabanınızın boş olacağını garanti etmez. Bir şekilde yanlışlıkla bir kayıt eklemeniz mümkün olabilir ve şimdi bu duruma geri dönmeye devam ediyor.

Testlerinizin her seferinde parlak bir veri tabanına sahip olduğundan emin olmak istiyorsanız, database_cleaner gemine bir göz atmalısınız.

bundan sonra mücevher database_cleaner eklemek otomatik mücevher dosyasında böylece veritabanı kesecek ve her şeyi sıfırlar bir mücevher olarak adlandırılan database_cleaner kullanın spec_helper.rb içine yapılandırmanız gerekir
+0

Çok eski sonrası biliyorum ama şu anda veri benim veritabanında (i aldım eski projeden silinmesini ilgili sorunlar yaşıyorum) varsayılan olarak yapar. Açık olmak gerekirse, “önce: hepsi var mı ... sonu” içinde bir şey işlem dışı değil mi? Bu neden ve şimdi bir gün boyunca başımı tırmalamak zorunda kaldım, bu konuda dokümantasyon çok sınırlı.örneğin, bu kod 'önce: tümünü içerir: User.delete_all end'. Düzenleme: Tamam, sadece bu bulundu (https://relishapp.com/rspec/rspec-rails/docs/transactions). wow, orijinal görevimi yapabilmek için çok fazla kodu yeniden kodlamak için zamanım var! – wired00

17

o

spec_helper.rb

config.use_transactional_fixtures = false 

config.before(:suite) do 
    DatabaseCleaner.strategy = :truncation 
end 

config.before(:each) do 
    DatabaseCleaner.start 
end 

config.after(:each) do 
    DatabaseCleaner.clean 
end 

ve ardından spec/destek dizinde yeni bir dosya oluşturmak

spec/destek/shared_db_connection.rb

classActiveRecord::Base 
    mattr_accessor :shared_connection 
    @@shared_connection = nil 

    def self.connection 
    @@shared_connection || retrieve_connection 
    end 
end 
ActiveRecord::Base.shared_connection=ActiveRecord::Base.connection 

reset.This Aaron Sumner

+0

Bu doğru/uygulanabilir çözüm –

+0

gerçekten doğru çözümdür – Hamdan

+1

Lütfen güncelleştirin, sınıf ActiveConcord :: Base 'okumanız gerekir – kingPuppy

1

basit çözüm emin RSpec işlemlerinde çalışacak testleri yapmaktır (Raylar kitabından 'Hergün Raylar RSpec ile test' dan alınmıştır Eğer testler Şimdi ne zaman veritabanı olacak

spec_helper.rb

config.around(:each) do |example| 
    ActiveRecord::Base.transaction do 
    example.run 
    raise ActiveRecord::Rollback 
    end 
end