неопределенный метод `each 'в сценарии factory_girl / rspec2

Я пытаюсь создать сообщение, связанное с голосованием. Таким образом, Post.votes будет генерировать связанные с ним голосования.

Factory.define :voted_post, :parent => :post, :class => Post do |p|
  p.association :votes, :factory => :vote
end

И мой 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

Итак, почему он должен вернуть эту ошибку:

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

ruby 1.8.7 (уровень патча 174 от 12 июня 2009 г.) [универсальный-darwin10.0]

Рельсы 3.0.0


person Trip    schedule 21.09.2010    source источник


Ответы (2)


Factory.define :voted_post, :parent => :post, :class => Post do |p|
  p.association :votes, :factory => :vote
end

Это то же самое, что пытаться уйти

some_voted_post.votes = Factory(:vote)

По сути, вы пытаетесь назначить один голос в виде массива.

ИЗМЕНИТЬ

У вас может быть массив, содержащий один голос, но у вас не может быть только один голос.

В этом разница между:

some_voted_post.votes = Factory(:vote)

и

some_voted_post.votes = [Factory(:vote)]

Первый не является массивом и, следовательно, не работает, второй - это массив.

person Jamie Wong    schedule 21.09.2010
comment
Спасибо, Джейми! И я предполагаю, что альтернативой было бы создание инкрементного секвенсора на самом заводе. - person Trip; 21.09.2010
comment
7-летний ответ, но сэкономил мне много времени. Спасибо. - person Sean Szurko; 01.05.2017

Если вы хотите назначить ассоциацию has_many, которая ожидает массив, а не одно значение, вы должны использовать длинную форму:

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

И инкапсулируйте создание ассоциации с [], чтобы гарантировать, что массив будет возвращен

person edzhelyov    schedule 28.07.2011