私はShoulda + FactoryGirlテストをスピードアップする方法を探しています。
テストしようとしているモデル(StudentExam
)には、他のモデルとの関連付けがあります。これらの関連オブジェクトは、を作成する前に存在している必要がありますStudentExam
。そのため、で作成されsetup
ます。
ただし、モデルの1つ(School
)の作成にはかなりの時間がかかります。setup
すべてのステートメントの前に呼び出されるためshould
、テストケース全体の実行には何年もかかります。つまり、実行されるすべてのshouldステートメントに対して新しい、、が作成されます@school
。@student
@topic
@exam
これらのオブジェクトを一度だけ作成する方法を探しています。テストケースの残りの部分を通して持続するレコードを作成できるstartup
forメソッドのようなものはありますか?before_all
基本的に私はRSpecのbefore(:all)とまったく同じものを探しています。これらのテストではこれらの高価なオブジェクトが変更されることはないため、依存関係の問題については心配していません。
これがテストケースの例です。長いコードについてお詫びします(私も要点を作成しました):
# 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 !@student_exam.in_progress
end
end
end