2014-01-24 8 views
13

Ich bin neu bei Rspec und Factory girl und möchte, dass mein Test auf einem bestimmten Datenbankstatus ausgeführt wird. Ich verstehe, dass ich Fabrikmädchen dazu bringen kann, diese Aufzeichnungen zu erstellen, und die Objekte werden nach dem Testlauf zerstört werden, aber was passiert, wenn ich Daten in der Datenbank habe.Rspec/FactoryGirl: Datenbankstatus löschen

Beispiel: Ich möchte, dass mein Test ausgeführt wird, wenn 3 Datensätze in der Datenbank vorhanden sind, die ich über Factory Girl erstellt habe. Allerdings habe ich derzeit bereits 1 Modell-Datensatz in der Datenbank, und ich möchte es nicht nur für den Test löschen. Dieses Modell zu zerstören ruiniert meinen Test.

Datenbank Inhalte

[#<Leaderboard id: 1, score: 500, name: "Trudy">] 

leaderboard_spec.rb

require 'spec_helper' 

describe Rom::Leaderboard do 

    describe "poll leaderboard" do 
     it "should say 'Successful Run' when it returns" do 
      FactoryGirl.create(:leaderboard, score: 400, name: "Alice") 
      FactoryGirl.create(:leaderboard, score: 300, name: "Bob") 
      FactoryGirl.create(:leaderboard, score: 200, name: "John") 
      Leaderboard.highest_scorer.name.should == "Alice" 
     end 
    end 

end 

Jetzt wird mein Test nicht bestehen, weil es falsch davon ausgehen, dass Trudy der höchsten Punktzahl ist, da der Test in ausgeführt haben ein falscher Zustand.

Bietet Factory-Girl trotzdem an, Datensätze aus der Datenbank zu löschen, dann Rollback dieses Löschen? Ähnlich wie es erstellt Datensätze in der Datenbank und Rollback

Antwort

33

Es ist beliebt, die database_cleaner gem. Sie können es hier finden:

https://github.com/bmabey/database_cleaner

Die Dokumentation empfiehlt die folgende Konfiguration für rspec:

RSpec.configure do |config| 

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

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

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

end 

Dadurch werden Sie sicher, dass Sie für jeden Test eine saubere Datenbank.

+0

Bietet Factory-Girl trotzdem an, Datensätze aus der Datenbank zu löschen, dann Rollback dieses Löschen? Ähnlich wie es erstellt Datensätze in der Datenbank und Rollback – user2158382

+0

Original-Frage scheint zu fragen, wie bestehende Datensätze intakt bleiben. Seine Frage nach dem Rückgängigmachen des Löschens ist eine Idee, aber ein anderer Ansatz könnte sein, das Löschen vollständig zu vermeiden. –

+0

große Hilfe thx so viel – austin

0

Um Ihre Rollback-Frage so direkt wie möglich zu beantworten: Nein, es gibt keine Möglichkeit, ein Löschen innerhalb eines Tests rückgängig zu machen.

Nach den Testkonventionen ist es normalerweise das Ziel, mit einem leeren Blatt zu beginnen und factory_girl zu verwenden, um das Szenario in der Datenbank, die Sie testen möchten, effizient zu erstellen.

können Sie erreichen, was Sie wollen, indem zum Beispiel ein, dies zu Ihrer leaderboards.rb Fabrik-Datei hinzufügen:

factory :trudy do 
    id 1 
    score 500 
    name "Trudy" 
end 

Oder Sie könnten eine einfache Hilfsfunktion in der Testdatei, die die Aufzeichnung regeneriert erstellen, wenn seine für Tests benötigt:

def create_trudy 
    FactoryGirl.create :leaderboard, 
    id: 1, 
    score: 500, 
    name: "Trudy" 
    end 
end 

Oder Sie könnten, bevor das alles an einem Ort (: suite) innerhalb eines Blocks beschreiben, etwa so:

describe "with a leaderboard record existing" do 
    before(:each) do 
    FactoryGirl.create :leaderboard, id: 1, score: 500, name: "Trudy" 
    end 
    # Tests with an initial leaderboard record 
end 
describe "with no leaderboard records initially" do 
    # Your test above would go here 
end 

In diesem letzten Vorschlag werden Ihre Tests sehr beschreibend und wenn Sie die Ausgabe anzeigen, werden Sie zu Beginn jedes Tests genau wissen, in welchem ​​Zustand sich Ihre Datenbank befand.