Перешёл с Laravel: ...
 
Уведомления
Очистить всё

Перешёл с Laravel: в Rails берут фикстуры или всё-таки factory_bot?

5 Сообщения
4 Пользователи
0 Реакции
627 Просмотры
Валерий40
Сообщения: 33
Автор темы
Читает чужие PR фулстек-разработчик
Присоединился: 4 года назад
[#8]

Месяц как пишу на Rails после восьми лет на Laravel. В новом проекте на Rails 7.0 генератор насоздавал test/fixtures/*.yml, и я пока не понимаю, как с этим жить, когда у заказа пять связей. В Laravel я привык к фабрикам: в тесте создал ровно то, что нужно, и всё видно глазами. Коллега говорит, что фикстуры быстрее и «так принято», а в половине статей ставят factory_bot с RSpec. Что у вас в проектах и почему? Хочется сразу выбрать нормально, а не переделывать через полгода.


4 ответа
kostya.sokurov
Сообщения: 73
Держит прод бэкенд-разработчик, senior
Присоединился: 4 года назад

Я на фикстурах сижу лет пять, и обратно не тянет. Главный плюс даже не скорость, а то, что данные загружаются один раз, а каждый тест работает в транзакции поверх них и не тратит время на создание пяти связанных записей. На наборе в 3000 тестов это минуты. Связи в yaml пишутся по имени, id руками не нужны:

# test/fixtures/orders.yml
paid:
  user: anna
  status: paid
  total_cents: 125000
  created_at: <%= 2.days.ago.to_fs(:db) %>

draft:
  user: anna
  status: draft
  total_cents: 0

В тесте пишешь orders(:paid) и поехали. Минус тоже есть: набор данных общий на все тесты, и если кто-то добавил запись в users.yml, может посыпаться тест, который проверял User.count. Лечится тем, что не пишешь проверок на общее число записей. А для редкого сложного случая никто не мешает создать запись прямо в тесте через create!.


Ответ
vova64
Сообщения: 23
Собрал свой gem фрилансер
Присоединился: 4 года назад

В чужих проектах, которые мне доставались на поддержку, почти всегда был factory_bot, и фабрики там разрастались так, что create(:order) тащил за собой пользователя, магазин, склад и три товара. Набор, который мог идти две минуты, шёл пятнадцать. Так что фабрики сами по себе не зло, зло в association по умолчанию везде. Если берёте factory_bot, сразу договоритесь, что в фабрике только обязательные поля.


Ответ
egorov_s
Сообщения: 5
Дружит с bundler бэкенд-разработчик
Присоединился: 4 года назад

видел и смешанный вариант: справочники фикстурами, заказы фабриками. живётся нормально, если не путать


Ответ
Валерий40
Сообщения: 33
Автор темы
Читает чужие PR фулстек-разработчик
Присоединился: 4 года назад

Спасибо, расклад понятен. Остаюсь на фикстурах и Minitest, раз проект новый и всё уже из коробки. Самое непривычное, что orders(:paid).user уже лежит в базе и ничего не надо создавать, в Laravel я бы на это три строки фабрик написал. Через пару месяцев посмотрю, не начнёт ли мешать общий набор данных.


Ответ