22

コールバックで使用するために、ファクトリーガールに追加の引数を渡す必要があります。このようなもの(しかし実際にはもっと複雑です):

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])

それを行う方法はありますか?

4

5 に答える 5

32

これは、一時的な属性のおかげで「ハッキング」なしで可能になりました(問題#49のコメントを参照

例:

FactoryGirl.define do
  factory :user do
    transient do
      bar_extension false
    end
    name {"foo #{' bar' if bar_extension}"}
  end
end

# Factory(:user).name = "foo"
# Factory(:user, :bar_extension => true).name = "foo bar"

Factory Girlバージョン<5.0の場合:

FactoryGirl.define do
  factory :user do
    ignore do
      bar_extension false
    end
    name {"foo #{' bar' if bar_extension}"}
  end
end

# Factory(:user).name = "foo"
# Factory(:user, :bar_extension => true).name = "foo bar"
于 2012-02-16T03:42:57.020 に答える
2

どうやら、これはモデル自体を変更する必要がある回避策なしでは現時点では不可能です。このバグは次の場所で報告されています:http://github.com/thoughtbot/factory_girl/issues#issue/49

于 2010-04-20T10:02:20.207 に答える
2

after_create1つのオプションは、フックがチェックする追加の投稿用の仮想アクセサーを作成することです。

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])
于 2010-04-19T11:43:48.860 に答える
1

別のオプションは、コレクション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])
于 2010-04-19T16:36:31.097 に答える
1

factorygirlファイル内でクラスを開く場合は、次のようにすることをお勧めします

require "user"
class User
  attr :post_count
end

クラスを上書きするのではなく、開いているようにします

于 2012-03-20T07:20:16.487 に答える