Sagen Sie, ich habe Modelle User
und Post
, ein Benutzer has_many
Beiträge und ein Beitrag belongs_to
ein Benutzer.Beschleunigen Verbindungen in Modellspezifikationen mit FactoryGirl - Erstellen vs Build vs Build_stubbed
Wenn ich eine Spezifikation für Post
, mein erster Instinkt schreiben ist, so etwas zu schreiben:
before do
@user = FactoryGirl.create :user
@post = @user.posts.new(title: "Foo", content: "bar)
end
... tests for @post go here ...
Aber dies wird einen neuen Benutzer erstellen - Schlagen die Datenbank - für jeden einzelnen Test, das ist Dinge verlangsamen. Gibt es einen besseren Weg, um meine Tests zu beschleunigen und zu vermeiden, die DB so oft zu treffen?
Wie ich es verstehe, kann ich FactoryGirl.build :user
nicht, weil, auch wenn es nicht die DB getroffen wird, werden die Verbände nicht richtig, da @user
nicht eine ID und so wird @post.user
nicht (es gibt nil
.)
I FactoryGirl.build_stubbed :user
, die ein erstellt verwenden könnte @user
„fake beibehalten“, die eine ID hat, aber @post.user
gibt noch gleich Null. Hat build_stubbed
irgendeinen praktischen Vorteil gegenüber build
, wenn ich Dinge im Zusammenhang mit Assoziationen teste?
Ich nehme an, ich könnte build_stubbed
Stub @post.user
verwenden, so dass es @user
zurückgibt ... gibt es einen Grund, warum dies eine schlechte Idee sein könnte?
Oder sollte ich einfach create
verwenden und den Geschwindigkeits-Treffer akzeptieren?
Die einzige andere Alternative, die ich mir vorstellen kann, wäre, @user in einem before(:all)
Block einzurichten, der wie eine schlechte Idee scheint.
Was ist der beste Weg, um diese Art von Tests auf eine saubere, prägnante Weise zu schreiben, die vermeidet, zu viele DB-Abfragen zu machen?