Почему ассоциация этой модели исчезает из теста после подтверждения (после обновления rails 5.1> 5.2)? - PullRequest
0 голосов
/ 20 февраля 2020

В этом приложении есть модель, которая отслеживает смену ролей. Тест, который я собираюсь описать, проходит последние пару лет без проблем и только начинает проваливаться, когда я обновил версию rails с 5.1 до 5.2.

Вот выдержка из модели:

class RoleChange < ApplicationRecord
  acts_as_paranoid
  belongs_to :actor, class_name: 'User', foreign_key: 'actor_id'
  belongs_to :subject, class_name: 'User', foreign_key: 'subject_id'
  validates :subject_id, presence: true

  def subject
    User.with_deleted.find(subject_id)
  end

  ...
end

И утверждение, которое не выполняется в спецификации c, является следующим

require 'rails_helper'

RSpec.describe RoleChange, type: :model do
  let(:organization) { create(:organization) }
  let(:admin) { organization.users.admins.first }
  let!(:user) { create(:employee_user, organization: organization) }
  subject { create(:role_change, subject: user, actor: admin) }

  describe 'associations' do
    it { is_expected.to belong_to(:actor) }
    it { is_expected.to belong_to(:subject) }
  end

  ...

end

Второе утверждение ассоциации завершается ошибкой:

  1) RoleChange associations is expected to belong to subject required:
     Failure/Error: User.with_deleted.find(subject_id)

     ActiveRecord::RecordNotFound:
       Couldn't find User without an ID
     # ./app/models/role_change.rb:28:in `subject'

Это очень расстраивает.

Когда я binding.pry внутри блока it, субъект выглядит как valid? и persisted? с subject_id, как и следовало ожидать.

Только когда я запускаю утверждение, subject_id магически становится nil.

Для дополнительного контекста, мои приключения в консоли rails:

The subject is there!

, когда я запускаю утверждение, оно терпит неудачу и говорит, что ноль не может быть найдено:

Schrodinger's foreign key

Полностью сбивает с толку. Можете ли вы помочь мне закончить sh это обновление рельсов? Это мой последний неудачный тест.

ОБНОВЛЕНИЕ:

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

...