Как вы создаете объекты с ассоциациями has_many, которые можно запрашивать в rspec? - PullRequest
0 голосов
/ 07 марта 2019

У меня есть схема, которую я хочу проверить в rspec.

class Question
  has_many :choices
end

class Choice
  belongs_to :question
  validates_presence_of :question
end

Это не похоже на работу:

Fabricator(:question) do
  text { sequence(:text) { |i| "my question#{i}" } }
  choices(count: 2) { Fabricate(:choice, question: question)}
end

И это не так:

Fabricator(:question) do
  text { sequence(:text) { |i| "my question#{i}" } }

  before_save do |question|
    choices(count: 2) { Fabricate(:choice, question: question)}
  end
end

Проблема, с которой я столкнулся, заключается в том, что я создаю изготовлениекак это:

Fabricator(:question) do 
  text "question"
end
question = Fabricate(:question)
choice_a = Fabricate(:choice, question: question)
choice_b = Fabricate(:choice, question: question)
(question.choices == nil)  #this is true

В моем rspec мне нужно запросить question.choices.

1 Ответ

1 голос
/ 07 марта 2019

В этом случае вы можете просто использовать сокращение.

Fabricator(:question) do
  choices(count: 2)
end

Изготовление автоматически создаст правильное дерево связей и позволит ActiveRecord выполнить все свои функции, чтобы связать их в базе данных.Объект, который вы получите после этого вызова, должен быть полностью сохранен и доступен для запроса.

Если вам нужно переопределить значения в вариантах, вы можете сделать это следующим образом.

Fabricator(:question) do
  choices(count: 2) do
    # Specify a nil question here because ActiveRecord will fill it in for you when it saves the whole tree.
    Fabricate(:choice, question: nil, text: 'some alternate text')
  end
end
...