Месяц как пишу на Rails после восьми лет на Laravel. В новом проекте на Rails 7.0 генератор насоздавал test/fixtures/*.yml, и я пока не понимаю, как с этим жить, когда у заказа пять связей. В Laravel я привык к фабрикам: в тесте создал ровно то, что нужно, и всё видно глазами. Коллега говорит, что фикстуры быстрее и «так принято», а в половине статей ставят factory_bot с RSpec. Что у вас в проектах и почему? Хочется сразу выбрать нормально, а не переделывать через полгода.
Я на фикстурах сижу лет пять, и обратно не тянет. Главный плюс даже не скорость, а то, что данные загружаются один раз, а каждый тест работает в транзакции поверх них и не тратит время на создание пяти связанных записей. На наборе в 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!.
В чужих проектах, которые мне доставались на поддержку, почти всегда был factory_bot, и фабрики там разрастались так, что create(:order) тащил за собой пользователя, магазин, склад и три товара. Набор, который мог идти две минуты, шёл пятнадцать. Так что фабрики сами по себе не зло, зло в association по умолчанию везде. Если берёте factory_bot, сразу договоритесь, что в фабрике только обязательные поля.
видел и смешанный вариант: справочники фикстурами, заказы фабриками. живётся нормально, если не путать
Спасибо, расклад понятен. Остаюсь на фикстурах и Minitest, раз проект новый и всё уже из коробки. Самое непривычное, что orders(:paid).user уже лежит в базе и ничего не надо создавать, в Laravel я бы на это три строки фабрик написал. Через пару месяцев посмотрю, не начнёт ли мешать общий набор данных.