22

我知道您可以使用 Shoulda 轻松测试属于关系:

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

是否可以使用 Shoulda 测试更复杂的 belongs_to 关系?像这样的东西:

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

5 回答 5

26

您应该能够使用:

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

Shoulda 的belong_to匹配器总是从关联中读取foreign_key并测试它是一个有效的字段名称,所以你不需要做更多的事情。

(参见Shoulda::Matchers::ActiveRecord::AssociationMatcher#foreign_key_exists?和相关方法)

于 2012-09-02T09:09:50.957 回答
14

现在可以测试自定义外键:

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

于 2013-08-28T07:44:12.673 回答
3

我知道我参加聚会有点晚了,所以我的解决方案可能需要最新版本的shoulda.

在撰写本文时,我在v 2.4.0.

我不需要class_namewith_foreign_key在我的规范中。

确保您在模型中指定class_nameforeign_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
于 2013-11-05T12:46:07.393 回答
3

如果协会喜欢

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,您也可以将其删除

于 2020-03-11T07:09:13.843 回答
2

所以should-matchers 的README 对细节很清楚,只是举了一些例子。我发现在类的 RDoc 中有更多的信息,belongs_to请查看association_matcher.rb。第一种方法是使用 Rdoc 的 belongs_to

  # 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

于 2012-09-02T08:58:49.823 回答