Ожидаемый ответ будет , но был в тесте контроллера в Rspec

#ruby-on-rails #ruby #rspec

#ruby-on-rails #ruby #rspec

Вопрос:

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

messages_controller_spec:

 context 'with valid attributes' do
  before :each do
    user = FactoryGirl.create :user
    sign_in user
  end
  it 'redirects to the root page' do
    xhr :post, :create, messages: attributes_for(:message)
    expect(response).to redirect_to root_path
  end
end
  

Теперь мой MessageController:

 def create
  @message = current_user.messages.build(message_params)
  @recipients = User.all
  if @message.save
    redirect_to root_path, notice: "Message Sent!" #The test fails here
  else
    flash[alert] = "Great Scott!"
    render :new 
  end
end
  

Запуск rspec с консоли выдает следующую ошибку:

Сбой / ошибка: ожидаемый (ответ).для redirect_to root_path Ожидаемый ответ будет <:redirect> , но был <200>

Я также проверил файл log /test.rb . Перенаправление выполнено успешно. Но ответ по-прежнему равен 200 вместо 3xx:

[1m[36m (0,3 мс)[0m [1mSAVEPOINT active_record_1[0m
[1m[35mSQL (1,4 мс)
[0m ВСТАВИТЬ В «сообщения» («body», «sender_id», «created_at», «updated_at») ЗНАЧЕНИЯ ($1, $2, $3, $4) ВОЗВРАЩАЕТ «id» [[«body», «myText»], [«sender_id», 1], [«created_at», «2016-10-06 11:16:14.934487″], [» обновленный_ат», «2016-10-06 11:16:14.934487»]]
[ 1 м [36 м (0,3ms)[0m [1mRELEASE ТОЧКА СОХРАНЕНИЯ active_record_1[0m
Перенаправлено на http://test.host /
Выполнено 200 OK за 40 мс (ActiveRecord: 5,9 мс) [1 м [35 м (0,6 мс) [ОТКАТ 0 м

Ответ №1:

Вы используете xhr , чтобы он давал 200

Попробуйте выполнить следующее

 context 'with valid attributes' do
  before :each do
    user = FactoryGirl.create :user
    sign_in user
  end
  it 'redirects to the root page' do
    post :create, messages: attributes_for(:message)
    expect(response).to redirect_to root_path
  end
end
  

Комментарии:

1. Да, это сделано. Можете ли вы объяснить, в какой ситуации xhr будет работать и почему он здесь не сработал?

2. @NovneetNov когда ваш запрос является ajax-запросом, в этом случае вы используете xhr . Но здесь ваш запрос не является ajax-запросом. это простой post-запрос, и после успеха он перенаправляет на root_path .

3. Хорошо, понял. xhr предназначен для запроса ajax. Следовательно, он возвращает 200.

4. В дополнение к приведенному выше ответу я просто хочу указать, что вы должны использовать _url для перенаправления, а не _path , в соответствии со спецификацией HTTP

5. Хороший момент! Спасибо.