Ich versuche, einige RSpec / Rails-Tests so umzugestalten, dass möglichst wenige Objekte in der Datenbank verbleiben, habe jedoch Probleme, herauszufinden, wie Tests wie die folgenden neu geschrieben werden können:
describe User do
context "record creation" do
before(:each) { @user = User.new(user_atts) }
it "should generate a confirmation_token" do
# Generated as the result of a callback
@user.save!
expect(@user.confirmation_token).to be_present
end
it "should set the confirmed_at attribute to nil" do
# Cleared as the result of a callback
@user.save!
expect(@user.confirmed_at).to be_nil
end
it "should call the send_confirmation_instructions method" do
@user.should_receive(:send_confirmation_instructions) {}
@user.save!
end
end
def user_atts
# return attributes hash
end
end
Dies ist ein ziemlich einfaches Beispiel, aber es gibt viele ähnliche Instanzen in meinen Spezifikationen, und zum größten Teil bleiben alle Datensätze in der Datenbank erhalten. Ich würde gerne die Vorteile von RSpec nutzen let
und subject
Helfer, bin mir aber nicht ganz sicher, ob diese hier überhaupt helfen würden.
Ich habe benutzt FabrikGirl viel und dachte, dass es vielleicht ist build_stubbed
Eine Strategie würde meine Spezifikationen etwas beschleunigen, aber ich konnte nicht viele Fälle finden, in denen dies dazu beitragen würde, die tatsächliche Datensatzerstellung einzuschränken (oder ich weiß nicht, wie ich sie verwenden soll).
Ich gehe davon aus, dass es einige Fälle gibt, in denen ein Test durchgeführt wird erfordert Datensatzerstellung, aber das obige Beispiel scheint kaum eines davon zu sein. Sollte ich überhaupt versuchen, dies umzugestalten, oder gibt es eine bessere Möglichkeit, diese Tests zu schreiben? Jede Hilfe wäre sehr dankbar.
Antworten:
2 für die Antwort № 1Meine Tests würden wahrscheinlich ungefähr so aussehen.
describe User do
let(:user) { FactoryGirl.build_stubbed(:user) }
context "record creation" do
it "should generate a confirmation_token" do
user.save!
expect(user.confirmation_token).to be_present
end
it "should set the confirmed_at attribute to nil" do
user.save!
expect(user.confirmed_at).to be_nil
end
it "should call the send_confirmation_instructions method" do
expect(user).to receive(:send_confirmation_instructions).once
user.save!
end
end
end
Das verwendet Factory Girl, um die Benutzermodelle zu erstellen. Außerdem hätte ich DatabaseCleaner, um die Datenbank nach jedem Test zu löschen, wie von @RahulGarg angegeben
Alles was Sie tun müssen, ist in Ihrem spec_helper so etwas zu konfigurieren
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
Dies bedeutet, dass nach jedem Test die Datenbank gelöscht wird.