Не удается получить доступ к непостоянным ассоциациям в RSpec - PullRequest
0 голосов
/ 10 октября 2018

Проблема: У меня есть две модели с именами Contract и Appendix.Последний имеет область действия persisted для исключения непостоянных объектов.Я хотел бы написать спецификацию для области, но, похоже, я вообще не могу получить доступ к непостоянным ассоциациям внутри спецификаций.

Модели:

class Contract < ApplicationRecord
  has_many :appendixes
end

class Appendix < ApplicationRecord
  belongs_to :contract
  scope :persisted, -> { where 'id IS NOT NULL' }
end 

Спецификация модели приложения:

context 'within persisted scope' do
  it 'returns only persisted appendixes' do
    contract = Contract.create(attributes_for(:contract))
    Appendix.create(attributes_for(:appendix, contract: contract))
    contract.appendixes.new
    byebug
  end
end

Примеры:

Когда достигается точка останова byebug, contract.appendixes возвращает то же, что и contract.appendixes.persisted, несмотря натот факт, что перед byebug инициализируется новое непостоянное приложение, и это должно иметь значение (?):

(byebug) contract.appendixes
#<ActiveRecord::Associations::CollectionProxy []>
(byebug) contract.appendixes.persisted
#<ActiveRecord::AssociationRelation []>

Между тем, при повторении той же спецификации в консоли rails, она работает как положено:

2.5.1 :061 > c = Contract.last
2.5.1 :062 > c.appendixes
 => #<ActiveRecord::Associations::CollectionProxy []>
2.5.1 :063 > c.appendixes.new
 => #<Appendix id: nil, ...
2.5.1 :064 > c.appendixes
 => #<ActiveRecord::Associations::CollectionProxy [#<Appendix id: nil, ...
2.5.1 :065 > c.appendixes.persisted
  Appendix Load (1.6ms)  SELECT  "appendixes".* FROM "appendixes" WHERE "appendixes"."contract_id" = $1 AND (id IS NOT NULL) LIMIT $2  [["contract_id", "b3a1645b-d4b1-4f80-9c43-6ddf3f3b7aba"], ["LIMIT", 11]]
 => #<ActiveRecord::AssociationRelation []>

Я использую FactoryBot атрибуты для инициализации объектов непосредственно в БД на всякий случай (ранее я полностью инициализировал объект через FactoryBot, но потом подумал, что FactoryBot может не взаимодействовать с БД обычным способом, этотакже сказано в документации FactoryBot ).

Вопрос: Как я могу прочитать непостоянные приложения из объекта контракта в моих спецификациях?

Я использую:

  • Ruby 2.5.1p57
  • Rails 5.1.6
  • RSpec 3.8.0
  • FactoryBot 4.11.0
  • FactoryBotRails 4.11.0

1 Ответ

0 голосов
/ 10 октября 2018

Боюсь, что при тестировании я мог случайно вызвать .reload объект contract в спецификации.Поэтому я думаю, что роль cache , на которую указывали @Sergio и @ayushi, на самом деле сыграла свою роль, спасибо за упоминание!

Мне удалось написать спецификацию с помощью FactoryBotтоже, поэтому нет необходимости исключать его из ситуации такого типа:

context 'withing persisted scope' do
  it 'returns only persisted appendixes' do
    contract = create(:contract)
    appendix = contract.appendixes.new
    expect(contract.appendixes).to include(appendix)
    expect(contract.appendixes.persisted).not_to include(appendix)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...