Ich bin auf der Suche nach einer Möglichkeit, meine Shoulda + FactoryGirl Tests zu beschleunigen.Shoulda + FactoryGirl: Kann ich meine Tests schneller machen?
Das Modell, das ich versuche zu testen (StudentExam
) hat Assoziationen zu anderen Modellen. Diese verknüpften Objekte müssen existieren, bevor ich eine StudentExam
erstellen kann. Aus diesem Grund werden sie in setup
erstellt.
Eines unserer Modelle (School
) benötigt jedoch viel Zeit für die Erstellung. Da setup
vor jeder should
Anweisung aufgerufen wird, nimmt der gesamte Testfall Äonen auszuführen - es ist eine neue schafft @school
, @student
, @topic
und @exam
für jeden sollte Anweisung ausgeführt.
Ich suche nach einer Möglichkeit, diese Objekte einmal und nur einmal zu erstellen. Gibt es so etwas wie eine startup
für before_all
Methode, die es mir erlauben würde, Datensätze zu erstellen, die den Rest des Testfalls beibehalten?
Grundsätzlich bin ich auf der Suche nach etwas genau wie RSpec before(:all). Ich bin nicht besorgt über das Problem der Abhängigkeiten, da diese Tests niemals diese teuren Objekte modifizieren werden.
Hier ist ein Beispiel für einen Testfall. Wir entschuldigen uns für den langen Code (die ich angelegt habe auch eine gist):
# A StudentExam represents an Exam taken by a Student.
# It records the start/stop time, room number, etc.
class StudentExamTest < ActiveSupport::TestCase
should_belong_to :student
should_belong_to :exam
setup do
# These objects need to be created before we can create a StudentExam. Tests will NOT modify these objects.
# @school is a very time-expensive model to create (associations, external API calls, etc).
# We need a way to create the @school *ONCE* -- there's no need to recreate it for every single test.
@school = Factory(:school)
@student = Factory(:student, :school => @school)
@topic = Factory(:topic, :school => @school)
@exam = Factory(:exam, :topic => @topic)
end
context "A StudentExam" do
setup do
@student_exam = Factory(:student_exam, :exam => @exam, :student => @student, :room_number => "WB 302")
end
should "take place at 'Some School'" do
assert_equal @student_exam, 'Some School'
end
should "be in_progress? when created" do
assert @student_exam.in_progress?
end
should "not be in_progress? when finish! is called" do
@student_exam.finish!
assert [email protected]_exam.in_progress
end
end
end
Ich mag diesen Ansatz am besten, aber es scheint nicht richtig zu funktionieren. '@@ school = Factory (: school)' löst einen Validierungsfehler aus, dass 'name' bereits vergeben ist (it' validates_uniqueness_of'). Ich habe versucht mit '@@ Schule || = Fabrik (: Schule)' und es funktioniert, wenn die Test-Datenbank sauber ist. Also habe ich mit der super-hässlichen '@@ school || = School.first || Schluss gemacht Factory (: school) ' –
Um die super-hässliche Problemumgehung zu beheben, verschieben Sie die Auswertung mit einer Instanzmethode. (siehe meine Bearbeitung) –