У меня есть проект Rails 5.1, использующий rspec / fixtures, и у меня возникают проблемы с получением приспособлений для загрузки объектов, связанных с assign_to / has_one / has_many: объект, для которого я запросил это приспособление, возвращается с его столбцами _id, заполненными на первый взгляд случайныминомер и ActiveRecord видит ассоциацию как nil
.Это происходит в больших классах со многими ассоциациями, а также в небольших классах данных с несколькими полями.
Если в моем тестовом коде я назначу эти ассоциации нормальному коду Ruby, объекты будут вести себя как обычно, и мои тесты пройдут.Однако при загрузке одних и тех же данных через фикстуры соответствующие записи недоступны, и тесты, требующие охвата данных между ассоциациями, не пройдены.
Например, здесь есть два затронутых класса:
#app/models/location.rb
class Location < ActiveRecord::Base
has_many :orders
has_many :end_user
belongs_to :retailer
belongs_to :depot
end
#app/models/retailer.rb
class Retailer < ActiveRecord::Base
has_many :locations
end
ИВот два соответствующих файла осветителей:
#spec/fixtures/locations.yml
loc_paris:
retailer: ret_europe (Retailer)
name: "Paris"
nickname: "paris"
loc_washington:
retailer: ret_usa (Retailer)
name: "Washington"
nickname: "washington"
#spec/fixtures/retailers.yml
ret_europe:
name: "AcmeCo France"
nickname: "acmecofr"
currency_type: "EUR"
ret_usa:
name: "AcmeCo USA"
nickname: "acmecousa"
currency_type: "USD"
С приведенными выше данными, выполнение pp locations(:loc_paris)
приводит к:
#<Location:0x0000000006eee1d8
id: 35456173,
name: "Paris",
nickname: "paris",
retailer_id: 399879241,
created_at: Wed, 23 May 2018 22:39:56 UTC +00:00,
updated_at: Wed, 23 May 2018 22:39:56 UTC +00:00>
Эти идентификаторы соответствуют нескольким вызовам, по крайней мере, втот же контекст RSpec.(Я поместил pp locations(:loc_paris)
в блок let
.) И все же pp locations(:loc_paris).retailer
возвращает nil
.
Я пытался использовать FactoryBot, однако нам пришлось от него отказаться.Я пытаюсь честно встряхнуть приборы, но кажется, что нам лучше всего просто строить объекты данных в реальном тестовом коде ... потому что эти решения работают без жалоб: /
Я что-то здесь не так делаю?Мы просим слишком много приспособлений?
Спасибо!
Том