Factorybot возвращает те же атрибуты при использовании помощника

#ruby-on-rails #ruby #random #factory-bot

#ruby-on-rails #ruby #Случайный #factory-бот

Вопрос:

Создан помощник для чтения файла csv и предоставления объекту случайных данных geojson.

Когда я вызываю этого помощника в консоли rails, я получаю случайные данные о местоположении, как и ожидалось.

 # LocationTestHelper
  def csv_data
    file_path = Rails.root.join('spec', 'factories', 'files', 'locations.csv')
    csv_text = File.read(file_path)
    CSV.parse(csv_text, headers: true)
  end

  def random_location
    nb_items = csv_data.length - 1
    index = Random.rand(0..nb_items)
    location = csv_data[index].to_hash
  end
  

Но когда я использую его внутри Factory Bot factory, создание или создание фабрики всегда возвращает одни и те же данные о местоположении.

 # events.rb factory
require './spec/factories/scripts/location_importer'
FactoryBot.define do
  factory :event do
    location = LocationTestHelper.random_location
    address { location['street'] }
    city { location['city'] }
    country { location['country'] }
    latitude { location['latitude'] }
    longitude { location['longitude'] }
  end
end
  

Затем, используя его в начальном файле, он создает записи с теми же данными о местоположении
Как я могу получить новые данные о местоположении для каждого экземпляра factory? Что я пропустил?

 # seeds.rb
 15.times do
    FactoryBot.create(:event)
  end
``
`
  

Ответ №1:

Стоит отметить, что фабрика оценивается только один раз при загрузке файла. Поэтому в дальнейшем вы location больше не меняетесь.

Но вы можете решить свою проблему, используя временный атрибут:

 FactoryBot.define do
  factory :event do
    transient do
      location { LocationTestHelper.random_location }
    end

    address { location['street'] }
    city { location['city'] }
    country { location['country'] }
    latitude { location['latitude'] }
    longitude { location['longitude'] }
  end
end
  

Комментарии:

1. Спасибо! Я, хотя атрибут transient можно было использовать только с фактическими атрибутами моделей, должен был лучше прочитать документы