#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. Хороший момент! Спасибо.