ruby-on-rails - validate - shoulda-matchers rubygems
Shoulda belongs_to con class_name y foreign_key (4)
Sé que puedes probar fácilmente una pertenencia a una relación usando Shoulda:
describe Dog dog
it { should belong_to(:owner) }
end
¿Es posible probar una relación más complicada con Shoulda? Algo como esto:
class Dog < ActiveRecord::Base
belongs_to :owner, :class_name => "Person", :foreign_key => "person_id"
end
Ahora es posible probar claves externas personalizadas:
it { should belong_to(:owner).class_name(''Person'').with_foreign_key(''person_id'') }
Así que el README should-matchers con los detalles, solo con algunos ejemplos. Descubrí que hay mucha más información en el RDoc de las clases, en el caso de belongs_to
echar un vistazo a association_matcher.rb . El primer método es para pertenecer a la 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)
Así que belongs_to
solo admite pruebas para :class_name
y :validate
.
Deberías poder usar:
it { should belong_to(:owner).class_name(''Person'') }
Shoulda belong_to
matcher siempre lee el foreign_key
de la asociación y prueba que es un nombre de campo válido, por lo que no necesita hacer nada más.
(Ver Shoulda::Matchers::ActiveRecord::AssociationMatcher#foreign_key_exists?
Y métodos asociados)
Sé que llego un poco tarde a la fiesta, por lo que mi solución podría requerir una versión actualizada de shoulda
.
En el momento de escribir estoy en v 2.4.0
.
No necesitaba class_name
o with_foreign_key
en mi especificación.
Asegúrese de que haya especificado class_name
y foreign_key
en su modelo.
# model.rb:
belongs_to :owner, inverse_of: :properties, class_name: "User", foreign_key: :owner_id
# spec.rb:
it { should belong_to(:owner) }
salida resultante
should belong to owner