Должно принадлежать с class_name и external_key

Я знаю, что вы можете легко проверить отношения принадлежности с помощью Shoulda:

describe Dog dog
  it { should belong_to(:owner) }
end

Можно ли с помощью Shoulda протестировать более сложные отношения принадлежности_к? Что-то вроде этого:

class Dog < ActiveRecord::Base
  belongs_to :owner, :class_name => "Person", :foreign_key => "person_id"
end

person LandonSchropp    schedule 02.09.2012    source источник


Ответы (5)


Вы должны уметь использовать:

it { should belong_to(:owner).class_name('Person') }

Сопоставитель belong_to компании Shoulda всегда считывает foreign_key из ассоциации и проверяет, является ли это допустимым именем поля, так что вам больше ничего делать не нужно.

(См. Shoulda::Matchers::ActiveRecord::AssociationMatcher#foreign_key_exists? и связанные методы)

person georgebrock    schedule 02.09.2012

Теперь можно протестировать пользовательские внешние ключи:

it { should belong_to(:owner).class_name('Person').with_foreign_key('person_id') }

См.: https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_record/association_matcher.rb#L122

person pwoestelandt    schedule 28.08.2013

Я знаю, что немного опаздываю на вечеринку, поэтому для моего решения может потребоваться последняя версия shoulda.

На момент написания я нахожусь в v 2.4.0.

Мне не нужны были class_name или with_foreign_key в моей спецификации.

Убедитесь, что вы указали class_name и foreign_key в своей модели.

# model.rb:  
belongs_to :owner, inverse_of: :properties, class_name: "User", foreign_key: :owner_id

# spec.rb:  
it { should belong_to(:owner) }

результирующий вывод:

should belong to owner
person Webdevotion    schedule 05.11.2013

Таким образом, в should-matchers README довольно мало подробностей, только несколько примеров. Я обнаружил, что в RDoc классов содержится гораздо больше информации, в случае belongs_to взгляните на association_matcher.rb. Первый метод для own_to с Rdoc

  # Ensure that the belongs_to relationship exists.
  #
  # Options:
  # * <tt>:class_name</tt> - tests that the association makes use of the class_name option.
  # * <tt>:validate</tt> - tests that the association makes use of the validate
  # option.
  #
  # Example:
  #   it { should belong_to(:parent) }
  #
  def belong_to(name)

Таким образом, belongs_to поддерживает только тесты для :class_name и :validate.

person mguymon    schedule 02.09.2012

если ассоциация нравится

belongs_to :custom_profile, class_name: 'User', foreign_key: :custom_user_id, optional: true

тогда rspec должен быть

it { should belong_to(:custom_profile).class_name('User').with_foreign_key('custom_user_id').optional }

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

person Sanjay Choudhary    schedule 11.03.2020