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
Ответы
Ответ 1
Вы должны иметь возможность использовать:
it { should belong_to(:owner).class_name('Person') }
Сопротивление Shoulda belong_to
всегда считывает foreign_key
из ассоциации и проверяет, что это допустимое имя поля, поэтому вам не нужно ничего делать.
(см. Shoulda::Matchers::ActiveRecord::AssociationMatcher#foreign_key_exists?
и связанные с ним методы)
Ответ 2
Теперь можно проверить пользовательские внешние ключи:
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
Ответ 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
.