/ / Write Rails-Tests, bei denen nicht so viele Datenbankobjekte bestehen bleiben - Ruby-on-Rails, Ruby-on-Rails-3, Testing, Rspec, Rspec2

Schreiben Sie Rails-Tests, bei denen nicht so viele Datenbankobjekte vorhanden sind - Ruby-on-Rails, Ruby-on-Rails-3, Testing, Rspec, Rspec2

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 № 1

Meine 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.