Rails和Rspec - 有一个通过多态

时间:2014-08-18 00:27:49

标签: ruby-on-rails rspec polymorphic-associations shoulda

我正在尝试使用shoulda matchers在rails中测试has_one:through关系。

我的关系结构看起来像这样(它是反向多态关联 - https://gist.github.com/runemadsen/1242485

class Container < ActiveRecord::Base
  has_many :contents
  has_many :videos, through: :contents, source: :item, source_type: "Video"
end

class Content < ActiveRecord::Base
  belongs_to :container, dependent: :destroy
  belongs_to :item, polymorphic: true, dependent: :destroy
end

class Video < ActiveRecord::Base
  has_one :content, as: :item
  has_one :container, through: :contents
end

这是我在Rspec中的shoulda matcher代码:

# video_spec.rb
it { should have_one(:container).through(:contents) }

我得到的错误是:

undefined method `klass' for nil:NilClass

任何人都可以告诉我为什么我收到此错误以及如何正确测试此关联?

1 个答案:

答案 0 :(得分:0)

假设你的全部你的spec文件中的代码(如果你只是发布一个修剪过的版本,我道歉),那么你需要将shoulda匹配器嵌套在{{1}下阻止describe类:

Video

您收到的错误表示被测对象为describe Video do it { should have_one(:container).through(:contents) } end 。通过将规范嵌套在nil类的describe块中,受测试的主题隐含为Video类。

documentation in the source code取得一个高峰,它有很多很好的例子。