Подтвердить что ты не робот

Shoulda принадлежит_to с class_name и foreign_key

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

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

Возможно ли протестировать более сложное отношение sort_to с помощью Shoulda? Что-то вроде этого:

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

Ответ 1

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

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

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

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

Ответ 3

Я знаю, что я немного опаздываю на вечеринку, поэтому для моего решения может потребоваться обновленная версия 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

Ответ 4

Таким образом, должен-matchers README довольно прост в деталях, просто имея некоторые примеры. Я обнаружил, что в RDoc классов есть намного больше информации, в случае belongs_to посмотрите association_matcher.rb. Первый метод - для belongs_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.