factory_girl/rspec2场景中未定义的方法`each'

Tri*_*rip 5 ruby ruby-on-rails rspec2 ruby-on-rails-3 factory-bot

我正在尝试建立一个与投票相关的帖子.所以Post.votes会生成与之相关的投票.

Factory.define :voted_post, :parent => :post, :class => Post do |p|
  p.association :votes, :factory => :vote
end
Run Code Online (Sandbox Code Playgroud)

而我的rspec2相对简单:

describe "vote scores" do
  it "should show me the total vote score" do
    @post = Factory(:voted_post)
    @post.vote_score.should == 1
  end
end
Run Code Online (Sandbox Code Playgroud)

那么为什么会返回这个错误:

Failures:
   1) Post vote scores should show me the total vote score
     Failure/Error: @post = Factory(:voted_post)
     undefined method `each' for #<Vote:0x105819948>
Run Code Online (Sandbox Code Playgroud)

ruby 1.8.7(2009-06-12 patchlevel 174)[universal-darwin10.0]

Rails 3.0.0

Jam*_*ong 12

Factory.define :voted_post, :parent => :post, :class => Post do |p|
  p.association :votes, :factory => :vote
end
Run Code Online (Sandbox Code Playgroud)

和尝试去一样

some_voted_post.votes = Factory(:vote)
Run Code Online (Sandbox Code Playgroud)

基本上你试图将一个投票分配为一个数组.

编辑

您可以拥有一个包含单一投票的数组,但您不能只进行一次投票.

这是区别:

some_voted_post.votes = Factory(:vote)
Run Code Online (Sandbox Code Playgroud)

some_voted_post.votes = [Factory(:vote)]
Run Code Online (Sandbox Code Playgroud)

前者不是数组,因此不起作用,后者是数组.


edz*_*yov 5

如果要分配需要数组而不是单个值的has_many关联,则应使用长格式:

Factory.define :voted_post, :parent => :post, :class => Post do |p|
  p.votes { |vote| [vote.association(:vote)] }
end
Run Code Online (Sandbox Code Playgroud)

并使用[]封装与关联的创建,以确保返回数组