2017-05-03 7 views
1

モデルQuestionhas_manyAnswerです。私は、少なくとも一つの答えを持っている質問を必要とし、私はrspecFactoryGirl:アソシエーションの長さが最小限で、レコードが無効になる

validates :answers, length: { minimum: 1 } 

私の工場でテストしています:

FactoryGirl.define do 
    factory :question do 
    text "Enunciado de la pregunta" 
    transient do 
     answers_count 2 
    end 

    after(:create) do |q, ev| 
     create_list(:answer, ev.answers_count, question: q) 
    end 
    end 

    factory :answer do 
    text "Enunciado de la respuesta" 
    end 
end 

しかし、私はspecファイルでcreate(:question)を行うときには、(作成RecordInvalid例外がスローされますモデルの保存を試みますが、作成後に関連する回答が作成されます)。

after(:build)に変更しようとしましたが、うまくいきません。

トランジェントanswers_countパラメータをコールバックなしで保存するために必要な回答を作成するにはどうすればよいですか?

答えて

1

、それはこのでの作業行ってきました:

after(:build) do |q, ev| 
    q.answers = build_list(:answer, ev.answers_count, question: q) 
end 

なぜですか?誰かがそれを知っていれば、それを説明することは素晴らしいことでしょう。

1

ご存知のように、質問を保存する前にアソシエーションを作成する必要があります。

は、私はあなたがこのような何かをしたいかもしれないと思う:

FactoryGirl.define do 
    factory :question do 
    ... 
    answers { [association(:answer, answers_count: 2)] } 
    end 
end 

または

は、おそらく build_list方法は助けることができる:

after(:build) do |q, ev| 
    build_list(:answer, ev.answers_count, question: q) 
end 

私はそれがafter(:build)で作業を取得することができました。 after(:build)の場合はdocsとそのコールバックの順序を参照してください。

私はそれが、この設定でモンゴで動作するようになった:

#spec/models/question_spec.rb 
describe Question do 
    let!(:question){create :question} 

    it 'should work', :focus do 
    expect(question).to be_valid 
    puts question.inspect 
    puts question.answers.inspect 
    end 
end 

#spec/factories/questions.rb 
FactoryGirl.define do 
    factory :question do 
    text "Enunciado de la pregunta" 
    transient do 
     answers_count 2 
    end 

    after(:build) do |q, ev| 
     create_list(:answer, ev.answers_count, question: q) 
    end 
    end 

    factory :answer do 
    text "Enunciado de la respuesta" 
    end 
end 

#models/question.rb 
class Question 
    include Mongoid::Document 
    include Mongoid::Attributes::Dynamic 

    field :text,  type:String 

    has_many :answers 
    validates_presence_of :answers 
end 

#models/answer.rb 
class Answer 
    include Mongoid::Document 
    include Mongoid::Attributes::Dynamic 

    field :text,  type:String 

    belongs_to :question 
end 

私のテストアウトプットは、このでした:試みの多くの後

Run options: include {:focus=>true} 
#<Question _id: 590a20ef8a681843088580bb, text: "Enunciado de la pregunta"> 
[#<Answer _id: 590a20ef8a681843088580ba, text: "Enunciado de la respuesta", question_id: BSON::ObjectId('590a20ef8a681843088580bb')>, #<Answer _id: 590a20ef8a681843088580bc, text: "Enunciado de la respuesta", question_id: BSON::ObjectId('590a20ef8a681843088580bb')>] 
. 

Finished in 0.16217 seconds (files took 2.87 seconds to load) 
1 example, 0 failures 
+0

これはなぜ 'validates_presence_of'で動作するのでしょうか?さらに重要なのは、バリデーターが 'length:{minimum:1}'よりも優れている理由ですか? –

+0

更新:とにかく、あなたの例題を試してみましたが、 'create:question'に' Answers can be be blank'をつけてクラッシュしています。意味があるなら、私はmongoを使用しません。 –

+0

さて、 'length:{minimum:1}'は動作するはずですが、私はそれを確認しましたが、私のテストでは早く動作しませんでした。おっとっと。だから、あなたは '答え'工場を持っていますか?あなたはそのコードを投稿できますか? –

関連する問題