Функциональный тест Rails с необходимыми дочерними элементами - PullRequest
0 голосов
/ 06 февраля 2011

Попытка сдать этот функциональный тест:

test "should create question" do
  assert_difference('Question.count') do
    post :create, :question => @question.attributes
  end
end

Но у @question есть валидаторы, которые требуют, чтобы определенные дети присутствовали конкретно по одной теме:

  class Question < ActiveRecord::Base
    has_many :topic_questions
    has_many :topics, :through => :topic_questions

    validate :has_topic

    def has_topic
      (errors[:base] << "You must have one topic") if (topics.count < 1)
    end
  end

Как мне 1) создать тему для @question в тесте, а затем 2) передать ее методу post, так как она не будет передана функцией .attributes ()?

Ответы [ 2 ]

1 голос
/ 06 февраля 2011
test "should create question" do
  assert_difference('Question.count') do
    @question.topics<<Topic.new(**set topics required and attribute here )
#or try this line of code 
    @question[:topics]={:name=>"bla bla" ** set attribute here what u need}
    post :create, :question => @question.attributes
  end
end
0 голосов
/ 06 февраля 2011

Тест в порядке, нужно изменить контроллер и / или модель.Вы не показали содержимое действия create, но есть два основных способа сделать это:

@question = Question.new(params[:question])
@question.build_topic(<some_params>)
if @question.save
  # ... etc ...

Или использовать accepts_nested_attributes_for :topic в модели Question, а затем передать темупараметры в хэше params.Какой метод лучше всего зависит от ваших конкретных обстоятельств.

...