2014-06-29 6 views
2
redirect_to browse_path(asset.parent_id), notice: "successfully created file!", status: 201 

201 - это статус, который вы должны установить, если вы создали ресурс. Не то время как выше метод работает для создания действия, спецификации для его действий больше не делает:Настройка кодов состояния http

subject { response } 
describe '.create' do 
    context 'when orphan' do 
     before do 
     post :create, asset: { parent_id: nil, uploaded_file: file } 
     end 

     it { should have_http_status 201 } 
     it { should redirect_to '/' } 
    end 
end 

Ожидание состояния проходит, но redirect_to ожидание терпит неудачу:

Expected response to be a <redirect>, but was <201> 

Я принимаю, что это уже не перенаправление 302, но оно все же перенаправляет пользователя на новый маршрут (который я хочу проверить). Redirect_to спецификации проходит, если я установить его в «неправильном» код 302, а не 201:

redirect_to browse_path(asset.parent_id), notice: "successfully created file!", status: 302 

так я должен беспокоиться о настройке кодов состояния? Я признаю, что на самом деле я понятия не имею, как браузер использует их, и мои приложения функционируют так же хорошо, если я старательно устанавливаю их в своих действиях или нет (просто используйте 302 перенаправления и 200 успехов).

Если коды статуса важны, как мне получить мои вышеуказанные спецификации?

+0

Я получаю 'неправильное количество аргументов (2 для 1)'? – Starkers

ответ

0

Вы можете утверждать от response.body или других атрибутов ответа в rspec. В этом случае то, что вы находитесь, это response.header["Location"]

Вы можете уклониться от проблемы с capybara/rspec, где вы можете утверждать current_url и все еще утверждать код состояния.

redirect_to - просто глупый помощник среднего уровня, и вам нужно достичь чуть более низкого уровня в ответ. Что-то или более высокий уровень с capybara, чтобы добраться туда, где вы хотите быть.

+0

Хотя я могу это сделать, 'its (: status) {должен eq 201}', я не могу выполнить 'its (: path) {should eq '/'}'. Путь не является методом объекта ответа. Я пытался проверить его, но не могу найти то, что хочу ... любые идеи? – Starkers

+1

response.header ["Местоположение"] - это место, куда направляется перенаправление. – BookOfGreg

0

Один из способов заключается в следующем:

its(:status){ should eq 201 } 
its(:location){ should eq 'http://test.host/' } 
1

От docs:

Код состояния может быть либо стандартный код HTTP-статуса в качестве целого числа, или символ, представляющий downcased, подчеркивается и символизированное описание. Обратите внимание, что код состояния должен быть кодом 3xx HTTP , или перенаправление не произойдет.

(курсив)

Проще говоря, это ошибка перенаправления с кодом 201 статуса.

+0

Спасибо, отметил. Мне нужно больше изучить http-коды ... – Starkers

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