2013-11-07 2 views
0

Я работаю над приложением курса, составленным из глав. В каждой главе есть викторина с вопросами и ответами.Rspec controllertest: коллекция объекта пуста

В каждом вопросе может быть только один правильный ответ. Я хочу проверить это правило с помощью RSpec.

В моем тесте ответы контроллера я написал тест:

it "does not create a new correct answer when there is already a correct answer" do 
     answer2 = Answer.create(title: "correct answer", is_correct: true, question_id: @question.id) 
     @question.answers << answer2 
     post :create, question_id: @question.id, answer: { title: "new answer", is_correct: true } 
     expect(Answer.count).to eq(1) 

В этом тесте я хочу, чтобы убедиться, что ни один новый ответ не создается, когда коллекция question.answers уже есть ответ с is_correct собственности установите значение true.

Однако мой тест не работает. Когда я проверить код в создании действия моего контроллера ответы и проверить, что вопрос имеет по крайней мере один ответ на это question.answers коллекции, кажется, что:

question 

возвращает пустой массив

=> [] 

Почему коллекция question.answer пуста, когда в тесте я добавил ответ на подбор ответов на вопрос?

@question.answers << answer2 
+0

Что такое 'вопрос'? –

+0

хорошо, как я могу передать вопрос с ответом на мои ответы. # Create action method. Спасибо за вашу помощь. – Toontje

+0

не стоит ли вам сохранять @question после ответа? в вашем контроллере вопрос загружается из db. Кстати, вы не должны проверять это внутри контроллера, так как контроллер не отвечает за эту логику, вы должны проверить, что в ваших ответах ответ недействителен, если вопрос, к которому он принадлежит, уже имеет правильный ответ – arieljuod

ответ

0

Я не могу ответить точно, но я могу предложить предложения, чтобы найти актуальную проблему.

Есть две вещи, которые вы должны попытаться изолировать его, здесь:

  1. убедитесь, что @question из теста и один в своем действии действительно то же самое (вы можете проверить его #id, или даже его #object_id)
  2. в тестах (и в самом деле, везде, где вы не проверяете статус проверки), вы должны использовать , а не #create, так что неспособность создать запись вызовет очевидное исключение.
+0

Hi Оливье, спасибо за советы по тестированию. Тем временем я использую проверку обратного вызова для предотвращения множественных ответов на вопрос с атрибутом is_correct, установленным в true: validates_uniqueness_of: is_correct, условия: -> {где (is_correct: true)} – Toontje

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