При налаштуванні тестів в новому проєкті, де є кілька моделей - User, Post і так далі. Всі factories реєструвались нормально, крім User.
Loading development environment (Rails 7.0.4.3)
irb(main):001:0> FactoryBot.create(:user)
/Users/memecode/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/activesupport-7.0.4.3/lib/active_support/hash_with_indifferent_access.rb:194:in `fetch': Factory not registered: "user" (KeyError)
/Users/memecode/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/activesupport-7.0.4.3/lib/active_support/hash_with_indifferent_access.rb:194:in `fetch': key not found: "user" (KeyError)
Виклик FactoryBot.factories також підтвердив, що всі factories окрім User зареєстровані. Після пошуків причини, виявилось що просто було інстальовано лібу FactoryBot, а нам потрібен FactoryBot для Rails.
Фіксимо помилку реєстрації фабрики (Factory not registered: "user")
Тож міняємо:
gem 'factory_bot', '~> 6.5'
на
gem 'factory_bot_rails', '~> 6.4', '>= 6.4.4'
Звісно ж запускаємо
bundle
І все запрацює. factory_bot_rails має в залежностях factory_bot, тож нам потрібна лише ліба у нашому Gemfile.
В чому різниця між factory_bot та factory_bot_rails?
factory_bot — це основна ліба для роботи з фабриками, свого роду "простий Ruby інструмент". Коли вам потрібен простий і надійний спосіб створення тестових даних у Ruby, саме factory_bot береться за цю задачу.
Він дозволяє визначати фабрики, які створюють моделі зі зручними налаштуваннями. Наприклад, хочете згенерувати користувача? Замість того, щоб прописувати всі параметри вручну, factory_bot автоматично заповнить їх за вас. Але є одна умова: ви повинні самостійно подбати про те, як ці фабрики будуть завантажуватись у вашому проєкті, особливо якщо це щось складніше за стандартний Rails-додаток.
А що ж
factory_bot_rails? Це скоріше "помічник", створений для того, щоб зробити роботу з factory_bot у Rails максимально безшовною.
Уявіть, що у вас є великий Rails-додаток, де кілька десятків моделей і тестів. Замість того, щоб щоразу вручну налаштовувати підключення фабрик, factory_bot_rails робить це автоматично. Він інтегрується з тестовим середовищем Rails і гарантує, що всі фабрики будуть готові до використання. Більше того, він додає кілька корисних команд у Rails, наприклад, для швидкого створення фабрик під нові моделі.
Отже, можна сказати, що factory_bot — це основа, а factory_bot_rails — це обгортка, яка робить цю основу зручною саме для Rails-розробників. Вони працюють разом: перший забезпечує функціональність, а другий — комфорт. Якщо у вас Rails-додаток, вам буде достатньо лише factory_bot_rails, адже він вже містить усе необхідне. Але якщо ви хочете використовувати фабрики поза Rails або кастомізувати їх під свої потреби, тоді знадобиться саме factory_bot.
Ну і варто згадати лібу Faker, яка дуже часто використовується для генерації контенту у фабриках. Вона зекономить час та дозволить створити об'єкти більш схожими на реальні.