Обновление с FactoryGirl до factoryBot приводит к NoMethodError - PullRequest
3 голосов
/ 12 марта 2019

Я пытался конвертировать из FactoryGirl в FactoryBot. Это не должно быть большой проблемой, но я не заставляю его работать. Код:

Добавлено в Gem File

gem 'factory_bot'

Добавлено в spec_helper

FactoryBot.definition_file_paths = %w(spec/factories)
FactoryBot.find_definitions

config.include FactoryBot::Syntax::Methods

Завод

FactoryBot.define do
  factory :user do
    first_name 'John'
    last_name  'Doe'
    birthdate  { 21.years.ago }
    admin false
  end
end

Когда я пытаюсь запустить тест rspec, я получаю следующую ошибку:

NoMethodError: undefined method 'first_name' in 'user' factory!
   Method_missing at C:/jruby-9.1.17.0/lib/ruby/gems/shared/gems/factory_bot-5.0.2/lib/factory_bot/definition_proxy.rb:97
   block in (root) at <path to factory>

Мне кажется, что камень правильно загружен в проект, код factoryBot выполняется. Но по какой-то причине он не признает структуру завода.

Примечание: - Я установил / обновил комплект

1 Ответ

7 голосов
/ 12 марта 2019

Как люди говорили в комментариях, статические атрибуты, такие как first_name 'John', устарели на v4 (отметьте это руководство ), а затем удалили на v5, альтернатива - сделать их похожими на динамические атрибуты: first_name { 'John' } .

Они даже включили Rubocop, чтобы помочь вам исправить все ваши фабрики:

rubocop \
  --require rubocop-rspec \
  --only FactoryBot/AttributeDefinedStatically \
  --auto-correct

Я рекомендую выполнить миграцию медленно, но верно, перейдите с FactoryGirl на FactoryBot, используя аналогичную версию, запустите свои спецификации, проверьте все предупреждения об устаревании, запустите настраиваемый Rubocop для автоматического исправления ваших фабрик, затем только мигрируйте основные версии после прочтения changelog .

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

Рад, что вы нашли выход.

...