2012-07-18 4 views
6

私は後に、私の工場でフックを構築/作成をドライアップしたい:DRY FactoryGirlは後に作成/構築フック

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でメソッドを定義することはできませんようだということですか?どのようにDRYするのか?

答えて

6

まず、after(:create)は、暗黙のうち、少なくともFactoryGirlの最近のバージョンでは、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 

build()の代わりにbuild_stubbed()を使用すると、after(:build)は発生しません。このスレッドは、このスレッドを検出したときに実行しようとしていたものです。このコードをDRYするには、callback()メソッドを使用して複数のメソッドに対して同じブロックを呼び出すことができます。

factory :user do 
    callback(:after_build, :after_stub) do |user| 
    do_something_with(user) 
    end 
end 
1

これは安いトリックかもしれませんが、あなたは、第二工場でラムダを作成することができます。

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のスタッフまで。

+0

これはすべきことです。これはあなたのコードとかなり同じです。評価者がラムダバージョンではnilなら、あなたのバージョンではnilでなければなりません。元の作業コードとnils(スタックトレース)を取得するコードの両方を私に教えてください。私は現在デバッグするのに十分な情報がありません。 –

+0

これ以上の作業は必要ありません。大したことではありません。基本的には、ショートカットがあるかどうかチェックしたいと思っていました。とにかく私はhttps://gist.github.com/3140033でモデルを見ることができます。残りは1:1です。 – wintersolutions

+0

さて、心配する必要はありませんが、コードをチェックアウトした後、私は 'evaluateator'が何であるか分かりません:) –

関連する問題