Разница между ответом и last_response в RSpec - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть тест, который проверяет, возвращает ли запрошенная страница код состояния 200:

expect(response).to have_http_status(:success)

Однако, если я явно возвращаю другой код состояния, используя следующий тест:

return render json: { error: 'error message' }, status: :unprocessable_entity

он все еще проходит.

Почему response и last_response имеют разные статусы:

response.status      # 200
last_response.status # 422

1 Ответ

0 голосов
/ 25 апреля 2018

response предоставляется ActionController::TestCase.

Из документов :

Объект ActionDispatch :: TestResponse, представляющий ответ объектапоследний ответ HTTP.

Для справки здесь - это документы rspec для тестов контроллера.Это может помочь понять, как response предполагается использовать.


last_response взято из Rack::MockResponse < Rack::Response

Из документов :

Возвращает последний ответ, полученный в сеансе.Вызывает ошибку, если еще не было отправлено ни одного запроса.


В вашем тестовом примере вы, вероятно, использовали метод, позволяющий имитировать посещение страницы.Это установит ваш response.status на 200, поскольку вы получили успешный запрос.Если вы затем используете Rack для стимулирования конечной точки, например:

put '/users', {my_user: 'blah'}

, и вы делаете это с неверными параметрами, тогда ваш last_response.status будет 422.

В конечном счете, путаницапроисходит сходство имен между ActionController и Rack::MockResponse, что, я согласен, довольно запутанно.

...