7

ファクトリで作成/ビルド後のフックをドライアップしたい:

FactoryGirl.define do

  factory :poll do

    sequence :title do |n|
      "MyPollTitle#{n}"
    end
    sequence :description do |n|
      "MyPollDescription#{n}"
    end
    user

    factory :poll_with_answers do

      ignore do
        answers_count 2
      end

      after(:build) do |poll, evaluator|
        evaluator.answers_count.times do
          poll.answers << build(:answer, poll: poll)
        end
      end

      after(:create) do |poll, evaluator|
        evaluator.answers_count.times do
          poll.answers << create(:answer, poll: poll)
        end
      end
    end
  end
end

私が直面していた問題は、FGでメソッドを定義できないように見えることです。これを乾かす方法を考えますか?

4

2 に答える 2

7

まず、少なくとも最近のバージョンのFactoryGirlでは、after(:create)暗黙的にを呼び出します。after(:build)

after(:build)-ファクトリがビルドされた後に呼び出されます(FactoryGirl.build、FactoryGirl.createを介して)

https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#callbacks

したがって、あなたの場合、次のコードで十分です。

after(:build) do |poll, evaluator|
  evaluator.answers_count.times do
    poll.answers << build(:answer, poll: poll)
  end
end

ただし、の代わりにafter(:build)を使用してもトリガーされません。これは、このスレッドに出くわしたときに実行しようとしていたことです。このコードを乾かすには、このメソッドを使用して、複数のメソッドに対して同じブロックを呼び出すことができます。build_stubbed()build()callback()

factory :user do
  callback(:after_build, :after_stub) do |user|
    do_something_with(user)
  end
end
于 2014-02-25T19:14:30.920 に答える
1

これは安価なトリックかもしれませんが、2番目のファクトリでラムダを作成できます。

factory :poll_with_answers do
  ignore do
    answers_count 2
  end

  make_answers = lambda do |poll, evaluator, method|
    evaluator.answers_count.times do
      poll.answers << send(method, :answer, poll: poll)
    end
  end

  after(:build) do |poll, evaluator|
    make_answers.call poll, evaluator, :build
  end

  after(:create) do |poll, evaluator|
    make_answers.call poll, evaluator, :create
  end
end

私はこのパターンにまったく満足していませんが、少なくともそれはDRYのものです。

于 2012-07-18T08:28:24.280 に答える