Как мне пройти более быстрые тесты и при этом использовать Factory Girl? - PullRequest
3 голосов
/ 09 июня 2011

Мне очень нравится использовать Factory Girl для настройки моих тестов.Я могу строить цепочки ассоциаций в одну строку.Например:

Factory.create(:manuscript)

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

Однакоесть цена конечно.Создание нескольких объектов на заднем плане означает, что мои юнит-тесты иногда занимают 0,8 секундыЭто нормально, когда ваше приложение маленькое, но теперь у меня есть несколько сотен тестов, и мои спецификации запускаются более минуты (не считая времени, которое требуется приложению для раскрутки).Мне становится больно.

Меня не особо интересует что-то слишком радикальное, например, насмешка над всем.По крайней мере, пока мое приложение относительно небольшое, я бы хотел сохранить абстракции своей фабричной девушки.Я просто хочу найти способ заставить их работать немного быстрее.

Есть предложения?

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

Если вы тестируете поведение объектов и вам не нужно сохранять их в базе данных, вы можете использовать Factory.build(:model).Он в основном создает экземпляр объекта и его ассоциаций, но не записывает его в БД.Это будет намного быстрее, чем создание и хранение всех этих объектов.Если вы все еще хотите записать некоторые или большинство объектов в БД, вы можете настроить тестовую базу данных памяти SQlite. Вот пример

1 голос
/ 14 августа 2011

Не уверен, что есть хорошее решение этой проблемы. Как и предлагал Берлингтон, вы можете сэкономить время, используя Factory.build вместо Factory.create. Но даже это не так быстро, как тестирование старых рубиновых объектов. Похоже, дело в том, что заводская девушка - плохой выбор, если ты очень озабочен скоростью.

Тем не менее, я смог сделать несколько довольно значительных улучшений скорости, прочитав весь мой набор и широко используя гем rspec-set . Это позволяет вам выполнить настройку один раз - и только один раз - для всей группы тестов. Это похоже на использование before(:all) за исключением того, что он использует преимущества транзакций для сброса состояния объектов между каждой спецификацией.

...