はじめに
Rails 6 に追加された新機能を試す第103段。 今回は、 ActionDispatch::Response#content_type
編です。
Rails 6 では、 content_type
は、 Content-Type Header の情報をそのまま返すようになります。
Ruby 2.6.5, Rails 6.0.0, Rails 5.2.3 で確認しました。
また、RSpec のバージョンは、 3.9.0 です。
$ rails --version
Rails 6.0.0
今回は、User CRUD を作り、request spec を変更することにより確認します。
RSpec の導入などについては、 Rails6 のちょい足しな新機能を試す24(unfreeze_time 編) などを参考にしてください。
Rails プロジェクトを作る
$ rails new rails_sandbox
cd rails_sandbox
User の CRUD を作成する
$ bin/rails g scaffold User name
request spec を編集する
spec/requests/users_spec.rb
を編集します。
ここで response.content_type
と response.media_type
のテストを追加していることに注意してください。
require 'rails_helper'
RSpec.describe "Users", type: :request do
describe "GET /users" do
it "works! (now write some real specs)" do
get users_path
expect(response.content_type).to eq('text/html; charset=utf-8')
expect(response.media_type).to eq('text/html')
expect(response).to have_http_status(200)
end
end
end
実際にテストする
実際にテストすると spec が通ることが確認できます。
$ rspec spec/requests/users_spec.rb
Rails 5 では
Rails 5.2.3 では、 content_type
は text/html
を返すため spec が失敗します。
つまり、以下のように書くと、 spec が通ります。
expect(response.content_type).to eq('text/html')
ちなみに
今回、 request spec に登場した response
のクラスは、 ActionDispatch::Response
の 派生クラスの ActionDispatch::TestResponse
です。
ですが、 content_type
メソッドは、 ActionDispatch::Response
クラスで実装されています。
試したソース
試したソースは以下にあります。
https://github.com/suketa/rails_sandbox/tree/try103_response_content_type