2014-11-06 2 views
-1

У меня есть приложение для рельсов, которое я пытаюсь проверить. В этом приложении у меня есть модель вопроса, в которой есть много ответов.FactoryGirl не создает ассоциации

class Question < ActiveRecord::Base 
    has_many :answers, dependent: :destroy 
    accepts_nested_attributes_for :answers, reject_if: lambda { |a| a[:text].blank? }, allow_destroy: true 
    ... 
end 

и

class Answer < ActiveRecord::Base 
    belongs_to :question 
    ... 
end 

Вот посмотрите на мой файл factories.rb, в котором я пытаюсь создать вопрос со многими ответами. (Примечание: Я последовал за пример, перечисленные здесь https://www.google.com/search?sourceid=chrome-psyapi2&ion=1&espv=2&ie=UTF-8&q=factorygirl%20associations точно, если я не упускать из виду то, что я не вижу.)

factory :question do 
    sequence(:text) { |n| "What is #{n} + #{n}?" } 

    factory :question_with_answers do 
     transient do 
      answers_count 5 
     end 

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

factory :answer do 
    sequence(:text) { |n| "Sample Answer #{n}" } 

    question 
end 

А вот посмотреть на спецификации:

require 'spec_helper' 

describe Question do 
    let!(:question) { FactoryGirl.create :question_with_answers } 

    it "should have 5 anwers" do 
    expect(question.answers.length).to eq 5 
    end 
end 

Когда я бегу это основная спецификация, я получаю следующее сообщение об ошибке отказа /:

1) Question should have 5 anwers 
Failure/Error: expect(question.answers.length).to eq 5 

    expected: 5 
     got: 0 

    (compared using ==) 
# ./spec/models/question_spec.rb:17:in `block (2 levels) in <top (required)>' 

Я не знаю, почему он не ассоциирует ответы на вопрос. Я вижу что-то прямо под носом? Заранее спасибо.

Другие, возможно, полезной информация - Я использую: factorygirl 4.5.0 рельсы 4.1.5 RSpec 3.1.0

+0

попробуйте использовать id 'create_list (: answer, valuator.answers_count, question_id: question.id)', если нет, попробуйте передать вопрос непосредственно каждому из ответов. как 'answer.question = question; answer.save! ' –

+0

К сожалению, subbing в question_id тоже не работает. Я уже изменил спецификацию, чтобы вручную назначать ответы на вопросы, поэтому у меня она работает - казалось, что есть лучший способ сделать это. Спасибо за ваш ответ. –

ответ

1

Понял разобрался! Все, что я должен был сделать на самом деле присвоить вложенные атрибуты метода create_list на заводе так:

factory :question do 
    sequence(:text) { |n| "What is #{n} + #{n}?" } 

    after(:create) do |question| 
     question.answers = create_list(:answer, 5, question: question) 
    end 

    assessment 
end 

Я тоже больше не создает завод внутри завода (как я устранил: question_with_answers завод) и вместо этого просто вызвал метод after (: create) после назначения свойств. Надеюсь, это может помочь кому-то, у кого есть проблемы с этим.

Смежные вопросы