2013-10-06 11 views
9

Immer wenn ich einen Benutzertest durchführe, verlässt RSpec den Fabricated-Benutzer in der Testdatenbank, nachdem der Test abgeschlossen wurde, was meine anderen Tests zunichte macht. Ich werde eine rake db:test:prepare tun, aber wenn ich meine Tests erneut ausführen, wird der Datensatz in meiner Datenbank neu erstellt. Ich habe keine Ahnung, warum das passiert. Es passiert nur mit Benutzerobjekten.RSpec verlässt den Datensatz in der Testdatenbank

In meiner spec_helper Datei habe ich auch:

config.use_transactional_fixtures = true 

Hier ist ein Beispiel Test, der einen Datensatz erzeugt:

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 

Verarbeiter:

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

dies alles habe zu mit meinem Benutzermodell machen?

Antwort

0

Wenn ich raten musste, scheint die Linie post :create, email: alice.email ein wahrscheinlicher Kandidat für die tatsächliche Benutzererstellung zu sein.

Stub diese Linie mit einem gefälschten Test und sehen Sie, ob Sie immer noch einen Benutzer in der DB erstellt bekommen.

4

Jeder Test ist in eine Datenbanktransaktion eingebettet. Das bedeutet, dass alles, was während des Tests erstellt wurde, nach Abschluss des Tests verschwunden sein sollte. Daher würde ich vermuten, dass alles, was Sie in Ihrer Datenbank haben, außerhalb des Tests selbst gemacht wurde (wie in einem before(:all) Block).

Auch dies garantiert nicht, dass Ihre Datenbank jedes Mal leer ist, wenn Sie Ihre Tests ausführen. Es ist möglich, dass Sie versehentlich einen Datensatz hinzugefügt haben, und jetzt wird er immer wieder in diesen Zustand zurückversetzt.

Wenn Sie sicherstellen möchten, dass Ihre Tests jedes Mal eine glänzende Datenbank haben, sollten Sie sich den Edelstein database_cleaner ansehen.

+0

Sehr alte Post, ich weiß, aber ich bin derzeit Probleme mit Daten gelöscht werden aus meiner Datenbank (ein Vermächtnis Projekt hat mich aufgenommen haben. Um klar zu sein, sagst du, dass alles innerhalb von "vorher: alle tun ... Ende" nicht transaktional ist? Warum sollte das so sein und ich habe mir einen Tag lang den Kopf darüber gekratzt, die Dokumentation ist sehr begrenzt.Dieser Code enthält beispielsweise 'before: all do User.delete_all end '. Edit: Ok gerade gefunden, das (https://relisapp.com/rspec/rspec-rails/docs/transactions). Wow, Zeit, um viel Code umzuformen ... um meine ursprüngliche Aufgabe zu erledigen, grrr! – wired00

17

sollten Sie ein Juwel namens database_cleaner verwenden, die Ihre Datenbank gestutzt wird und alles automatisch zurückgesetzt, so in Ihrem gem Datei den Edelstein database_cleaner danach in Ihrem spec_helper.rb fügen Sie es konfigurieren

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 

und dann eine neue Datei in Ihrem spec/Support-Verzeichnis

spec/support/shared_db_connection.rb

012 erstellen

Nun, wenn Sie Ihre Tests der Datenbank ausgeführt wird reset.This wurde aus dem Buch ‚Jeden Tag Rails mit RSpec testing‘ von Aaron Sumner

+0

Dies ist die korrekte/praktikable Lösung –

+0

ist in der Tat die richtige Lösung – Hamdan

+1

Bitte aktualisieren, sollte lesen "Klasse ActiveRecord :: Base" – kingPuppy

1

Die einfachste Lösung ist, um sicherzustellen, RSpec in Transaktionen Tests ausgeführt wurde (Rails dies erfolgt durch Standard)

spec_helper.rb

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