2016-12-15 5 views
0

複雑な一連のモデルをモデルからフォームオブジェクトに移動しましたが、いくつかのフックを削除すると、私はいくつかのテストを中断しました。FactoryGirlでのフォームオブジェクトの使用

問題は私の工場がモデルを作成し、実行中のフックに依存することです。ここで明白な解決策は、フォームオブジェクトに割り当てるようにファクトリを変更することですが、これはフォームオブジェクトのインスタンスを返し、壊れたすべてのテストを更新する必要があります。 FactoryGirlにフォームオブジェクトを使用してモデルを作成させてから、プロパティ(具体的には組み立てられたモデルのプロパティ)を返しますか?

はここに現在の工場だ - フォームオブジェクトが同じフィールド名を使用しています。

factory :project do 
    status "Project active" 
    association :director, factory: :employee 
    association :manager, factory: :employee 

    category { Settings.project.categories.billable.first } 
    estimated_completion_date { Date.current } 
    estimated_project_start_date { Date.current } 
    name { Faker::Lorem.words.join(' ') } 
    likelihood { Settings.project.likelihoods.first } 
    project_type { Settings.project.types.first } 
    proposal_due_date { Date.current } 
    proposal_verdict_date { Date.current } 
    description { Faker::Lorem.paragraph } 
    research_independence { Settings.project.research_independence.first } 

    factory :unsuccessful_proposal do 
     status "Proposal unsuccessful" 
    end 

    factory :proposal_submitted do 
     proposal_submitted_date { Date.current } 
     status "Proposal submitted" 

     after(:build) do |proposal, evaluator| 
      proposal.clients << build(:client) 
     end 
    end 
end 

編集:私はクリスマスに、これはかなり近い聞くと、それは非常に少しの注意を得ました。私自身の研究では、工場でinitialize_withを使用してフォームオブジェクトを作成し、FactoryGirlの保存動作を変更するためにto_createを使用でき、FactoryGirlにカスタムビルド戦略を直接適用できます。私がそれをする方法を考えれば、私は自分の質問に答えるために戻るでしょう。現在のところ、関連付けは正しく行われていませんが、正しくプロジェクトを作成しているようです。

答えて

0

これが転倒した後、自分の研究をしました。ソリューション:FactoryGirlにはinitialize_withという関数があり、引数を必要とする関数initializeを呼び出すために使用できます。トリックはinitialize_withattributesを理解していることです。これは工場で定義したすべての属性のハッシュです。したがって、フォームの場合は、新しい(属性)を呼び出し、必要なものを実行し、フォームが作成しているモデルを最後に返すことができます。例えば

initialize_with do |result| 
    form = ProjectForm.new(attributes) 
    if form.save! 
     result = form.project 
    else 
     result = form.errors 
    end 
end 
関連する問題