为什么在Rspec示例中未定义的方法“has_many”?

时间:2011-09-22 10:12:30

标签: activerecord rspec

我正在玩一个关于在RSpec中通过关联测试has_many的示例。 我正在接受

   1) Foo specifies items
       Failure/Error: subject.should have_many(:items)
       NoMethodError:
         undefined method `has_many?' for #
       # ./spec/models/foo_spec.rb:10

我的问题:为什么has_many会被定义?

规范是:

describe Foo do
  it "specifies items" do
    subject.should have_many(:items)
  end
end

我的模特是:

foo.rb:

 class Foo < ActiveRecord::Base
   has_many :bars
   has_many :items, :through => :bars
 end

bar.rb:

class Bar < ActiveRecord::Base
  belongs_to :foo
  belongs_to :item
end

和item.rb:

class Item < ActiveRecord::Base
  has_many :foos, :through => :bars
  has_many :bars
end

1 个答案:

答案 0 :(得分:8)

嗯,模型对象上没有has_many?方法。 rspec-rails默认情况下不提供此类匹配器。但是,shoulda-matchers gem确实:

describe Post do
  it { should belong_to(:user) }
  it { should have_many(:tags).through(:taggings) }
end

describe User do
  it { should have_many(:posts) }
end

(例如来自shoulda-matcher documentation

只需将gem 'shoulda-matchers'添加到Gemfile,您就可以使用该语法。