Я работаю над приложением Rails 6, и в модульном тестировании полиморфной ассоциации с использованием Minitest я не могу понять, почему мой модульный тест видит ассоциацию в одном направлении, но nil
в другом направлении,Вот суть моего кода (сокращенно для ясности):
Модели
entry.rb
class Entry < ApplicationRecord
has_one :rich_text, as: :record, dependent: :destroy
validates_presence_of :rich_text
validates_associated :rich_text
end
rich_text.rb
class RichText < ApplicationRecord
belongs_to :record, polymorphic: true
validates :record_id, uniqueness: { scope: [:record_type, :record_id] }
validates :body_raw, presence: true
end
Светильники
entry.yml
entry_1:
title: Here is an entry title
slug: here-is-a-entry-title
rich_texts.yml
rich_text_1:
record: entry_1 (Entry)
body_raw: "<%= Faker::Markdown.sandwich(sentences: 5) %>"
Тест модели
class EntryTest < ActiveSupport::TestCase
def setup
@entry = entries(:entry_1)
@rich_text = rich_texts(:rich_text_1)
end
test "entry should be valid" do
assert @entry.valid? # This fails because @entry.rich_text is nil
end
end
Теперь в этом тесте выше, @entry.valid?
false
, потому что @entry.rich_text
оценивается как nil
. Поэтому он не проходит валидацию ассоциации.
Для получения дополнительной информации об этом тесте я заметил следующее в тесте:
@entry.rich_text
равно nil
@rich_text.record
- это Entry
. Не только это, но ... @rich_text.record_id == @entry.id
, что означает, что ... @rich_text.record == @entry
равно true
!
Если этоВ этом случае, почему бы тесту было известно об ассоциации между двумя моделями в одном направлении, но не учитывать ее с другой стороны?