Должен иметь + FactoryGirl: я могу сделать свои тесты быстрее?

Кто-то дал мне, 'Удаляют весь сценарий реестра' папок SVN - который является необходимой вещью для меня, теперь (это находится где-нибудь на этот поток).

я оставляю контроль учётных записей на - последняя вещь, которую я хочу, должен записать код, который работает с контролем учётных записей прочь, но терпит полный провал с ним на. Прежде чем я начал использовать Виртуальный ПК для установки тестовых сред для моего кода, я пытался оставить свой рабочий стол как 'ваниль' как возможный - я хотел протестировать при условиях, довольно подобных повседневному пользователю неразработчика.

Все вышеупомянутое для моей домашней системы разработки. Я пытаюсь сделать то же на работе в причине. За исключением материала SVN, потому что мы используем TFS в моем офисе.

5
задан Kyle Fox 3 November 2009 в 22:57
поделиться

4 ответа

Если проблема заключается в создании этих записей только один раз, вы можете использовать переменную класса. Это не чистый подход, но, по крайней мере, он должен работать.

# 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
2
ответ дан 15 December 2019 в 01:05
поделиться

http://m.onkey.org/2009/9/20/make-your-shoulda-tests-faster-with-fast_context - отличный пост о том, как сделать ваша shoulda / factory-girl тестирует быстрее, используя гем под названием fast_context. Дайте мне знать, если это не то, что вам нужно.

0
ответ дан 15 December 2019 в 01:05
поделиться

Какие тесты вы пытаетесь написать? Если вы действительно хотите убедиться, что все эти объекты правильно координируются, вы пишете интеграционный тест, и скорость не является вашей главной заботой. Однако, если вы пытаетесь провести модульное тестирование модели, вы можете добиться лучших результатов, агрессивно заглушив заглушки.

Например, если вы пытаетесь проверить, что экзамен использует имя своей школьной ассоциации, когда вы вызываете экзамен. местоположение (или как вы его называете), вам не нужен целый школьный объект. Вам просто нужно убедиться, что экзамен вызывает в школе правильный метод. Чтобы проверить это, вы можете сделать что-то вроде следующего (используя 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

В основном, Если вам нужно ускорить модульные тесты, потому что создание объектов слишком дорого, вы на самом деле не модульное тестирование. Кажется, что все вышеперечисленные тестовые примеры должны быть на уровне модульного теста, так что заглушите заглушку!

2
ответ дан 15 December 2019 в 01:05
поделиться

Существует плагин под названием fast_context ( ссылка на github ), который объединяет операторы следует в один контекст, ускоряя тесты.

] Другая вещь, которую я использовал для ускорения моих тестов, - это предварительное заполнение данных прибора. FactoryGirl работает медленно, потому что создает эти записи при каждом запуске блока установки.

Я написал плагин под названием Fixie , который использует ActiveRecord для предварительного заполнения тестовой базы данных, поэтому записи, необходимые для ваших тестов, уже созданы. Вы можете использовать Fixie вместе с FactoryGirl, если хотите также создавать новые записи во время выполнения.

0
ответ дан 15 December 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: