Дополнительные аргументы в пользу Девочки Фабрики

Я должен передать дополнительные аргументы девочке фабрики, чтобы использоваться в обратном вызове. Что-то вроде этого (но более сложный действительно):

Factory.define :blog do |blog|
  blog.name "Blah"

  blog.after_create do |blog|
    blog.posts += sample_posts
    blog.save!
  end
end

и затем создайте его с чем-то вроде этого:

Factory.create(:blog, :sample_posts => [post1, post2])

Какие-либо идеи, как сделать это?

22
задан Jack Chu 21 July 2010 в 00:29
поделиться

3 ответа

Один из вариантов - создать виртуальный аксессор для дополнительных сообщений, которые проверяет ловушка after_create :

class Blog
  has_many :posts
  attr_accessible :name, :title, ... # DB columns
  attr_accessor   :sample_posts      # virtual column
end

Factory.define :blog do |blog|
  blog.name 'Blah'

  blog.after_create do |b|
    b.posts += b.sample_posts
    b.save!
  end
end

Factory(:blog, :sample_posts => [post1, post2])
2
ответ дан 29 November 2019 в 04:54
поделиться

Другой вариант - использовать build вместо create и добавить : autosave в коллекцию:

class Blog
  has_many :posts, :autosave => true
end

Factory.define :blog do |blog|
  blog.name 'Blah'
  blog.posts { |_| [Factory.build(:post)] }
end

Factory(:blog, :posts => [post1, post2])
#or
Factory.build(:blog, :posts => [unsavedPost1, unsavedPost2])
1
ответ дан 29 November 2019 в 04:54
поделиться

По-видимому, в настоящее время это невозможно без обходных путей, требующих изменения самой модели. Об этой ошибке сообщается в: http://github.com/gotitbot/factory_girl/issues#issue/49

2
ответ дан 29 November 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: