Кто-то дал мне, 'Удаляют весь сценарий реестра' папок SVN - который является необходимой вещью для меня, теперь (это находится где-нибудь на этот поток).
я оставляю контроль учётных записей на - последняя вещь, которую я хочу, должен записать код, который работает с контролем учётных записей прочь, но терпит полный провал с ним на. Прежде чем я начал использовать Виртуальный ПК для установки тестовых сред для моего кода, я пытался оставить свой рабочий стол как 'ваниль' как возможный - я хотел протестировать при условиях, довольно подобных повседневному пользователю неразработчика.
Все вышеупомянутое для моей домашней системы разработки. Я пытаюсь сделать то же на работе в причине. За исключением материала SVN, потому что мы используем TFS в моем офисе.
Если проблема заключается в создании этих записей только один раз, вы можете использовать переменную класса. Это не чистый подход, но, по крайней мере, он должен работать.
# 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
# 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)
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
РЕДАКТИРОВАТЬ: Чтобы исправить супер-уродливое обходное решение, отложите оценку с помощью метода экземпляра.
# A StudentExam represents an Exam taken by a Student.
# It records the start/stop time, room number, etc.
class StudentExamTest < ActiveSupport::TestCase
...
private
def school
@@school ||= Factory(:school)
end
# use school instead of @@school
def student
@@school ||= Factory(:student, :school => school)
end
end
http://m.onkey.org/2009/9/20/make-your-shoulda-tests-faster-with-fast_context - отличный пост о том, как сделать ваша shoulda / factory-girl тестирует быстрее, используя гем под названием fast_context. Дайте мне знать, если это не то, что вам нужно.
Какие тесты вы пытаетесь написать? Если вы действительно хотите убедиться, что все эти объекты правильно координируются, вы пишете интеграционный тест, и скорость не является вашей главной заботой. Однако, если вы пытаетесь провести модульное тестирование модели, вы можете добиться лучших результатов, агрессивно заглушив заглушки.
Например, если вы пытаетесь проверить, что экзамен использует имя своей школьной ассоциации, когда вы вызываете экзамен. местоположение (или как вы его называете), вам не нужен целый школьный объект. Вам просто нужно убедиться, что экзамен вызывает в школе правильный метод. Чтобы проверить это, вы можете сделать что-то вроде следующего (используя Test :: Unit и Mocha, потому что это то, с чем я знаком):
test "exam gets location from school name" do
school = stub_everything
school.expects(:name).returns(:a_school_name)
exam = Factory(:exam, :school => school)
assert_equal :a_school_name, exam.location
end
В основном, Если вам нужно ускорить модульные тесты, потому что создание объектов слишком дорого, вы на самом деле не модульное тестирование. Кажется, что все вышеперечисленные тестовые примеры должны быть на уровне модульного теста, так что заглушите заглушку!
Существует плагин под названием fast_context ( ссылка на github ), который объединяет операторы следует в один контекст, ускоряя тесты.
] Другая вещь, которую я использовал для ускорения моих тестов, - это предварительное заполнение данных прибора. FactoryGirl работает медленно, потому что создает эти записи при каждом запуске блока установки.
Я написал плагин под названием Fixie , который использует ActiveRecord для предварительного заполнения тестовой базы данных, поэтому записи, необходимые для ваших тестов, уже созданы. Вы можете использовать Fixie вместе с FactoryGirl, если хотите также создавать новые записи во время выполнения.