RSpec have HTTP status upgrade
When upgrading a project to the Rails 5.2 pre-release we started to see
some deprecation warnings in our RSpec runs.
The warnings were as follows, and occurred wherever
have_http_status(:success)
or have_success_status
and the like
were used in tests.
.DEPRECATION WARNING: The success? predicate is deprecated and will be removed
in Rails 6.0. Please use successful? as provided by Rack::Response::Helpers.
(called from matches? at rspec/rails/matchers/have_http_status.rb:263)
This was annoying because many controller tests use
the have_success_status
matcher.
What changed
Rails, with this commit decided, in very reasonable fashion, to standardize the response status checking methods in ActionDispatch::TestResponse.
The team simply deprecated the success?
, missing?
and error?
methods
with the suggestion to use the successful?
, not_found?
,
and server_error?
methods pre-existing in
Rack::Response::Helpers
.
(ActionDispatch::TestResponse
inherits from ActionDispatch::Response
which
includes Rack::Response::Helpers
.)
In rspec-rails
, the have_http_status
matcher called these methods
in a meta-sense, by mapping the :success
, :missing
, and :error
symbols to corresponding methods invoked on the response.
How to repair?
One way to repair this would have been to support the replacement methods,
e.g. successful?
and require any extant tests using, for example,
have_http_status(:success)
to make the change to
have_http_status(:successful)
.
This would possibly be defensible as a “follow closely as a thin wrapper on Rails” strategy. Unfortunately, it would break a mountain of tests!
However the successful?
, server_error?
, and not_found?
methods have
been available to ActionDispatch::TestResponse
via
Rack::Response::Helpers
for many many years.
The method provided
introduces the new status codes, :successful
, :not_found
,
and :server_error
while maintaining support for the Rails deprecated ones.
It does so by mapping, for example, :success
to the successful?
method.
Thus the world of rspec-rails
turns in accordance with the heavens,
that is, Rails.