#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 можно было использовать только с фактическими атрибутами моделей, должен был лучше прочитать документы