Controller Specは何をテストするのか。
HTTPメソッドでのリクエストの際のアクションの挙動のテストをします。具体的には下記のようなテストです。
- どういったレスポンスコードが返ってくるのか。
- どういったテンプレートをレンダリングするのか。
- どういった変数がテンプレートに渡されるべきなのか。
実際に実務でコントローラスペックを利用する場合
そもそもコントローラスペックは非推奨になっていますが、あえて作成する場合は肥大化しやすいので下記の内容に絞るようにしましょう。
- コントローラのアクセス制御が正しく機能しているかをチェックすること
具体的には、「認可されていないユーザー」と「ゲストに対するユーザー」のチェックをするテストのことです。より細かいテストに関してはより上位のレベルのテストで補うようにすると良いでしょう。
コントローラのテストをするにあたり便利なGem
「rails-controller-testing」というGemをインストールします。
1 2 3 4 5 6 7 |
group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug', platform: :mri gem 'rails-flog', require: 'flog' gem 'rspec-rails', '~> 3.8' gem 'rails-controller-testing' ★追加する。 end |
bundleします。
1 |
bundle |
Railsサーバは再起動します。
Controller Specを利用するための準備
コントローラのテストを作成するための下記コマンドを実行しましょう。
1 |
rails g rspec:controller モデル名 |
Dockerを使用している場合は下記のようなコマンドになるでしょう。
1 |
docker-compose exec Railsのコンテナ名 bundle exec rails g rspec:controller コントローラ名 |
「spec/controllers/コントローラ名_controller_spec.rb」というファイルが生成されるのでこれがController Specのテストを記述するためのファイルになります。
サンプル
ユーザーコントローラを例に挙げて説明いたします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
RSpec.describe UsersController, type: :controller do describe 'ルーティング単位(例:GET #index') do before { get :index @referer = 'http://localhost' @request.env['HTTP_REFERER'] = @referer } #画面から渡ってくるパラメータの定義 let(:params) do { user: { name: 'user', password: 'password', } } end it 'レスポンスコードが200であること' do expect(response).to have_http_status(:ok) end it 'newテンプレートをレンダリングすること' do expect(response).to render_template :new end it '新しいUserオブジェクトがビューに渡されること' do expect(assigns(:user)).to be_a_new User end end end |
before { get : index }
UsersControllerのindexアクションに疑似的にgetリクエストをしています。これによりresponseという変数にGETのリクエスト結果が格納されます。
get :リクエストメソッド, format: :json(省略可), params: { 属性1:属性値 }
「format:: json」を指定するとリクエストをjson形式で送信します。(html形式でも可能です。)getメソッドでパラメータを渡したい場合は上記のように指定する必要があります。
post :コントローラのアクション名, format: :json(省略可), params: { 属性1:属性値 }
postを利用する場合は「コントローラのアクション名」(createや、show等)を引数に指定します。
@referer = 'http://localhost' と @request.env['HTTP_REFERER'] = @referer
リファラーにURLを埋め込みます。「redirect_to :back」と記述した場合はユーザーからのリクエストに含まれるHTTPリファラーに値が設定されていないと動きません。テストコードではリファラーは設定されないので明示的にテストコード内で設定してあげる必要があります。
response
ブラウザに返すべきアプリケーションが全データを保持しているオブジェクトです。この中にはHTTPレスポンスコードも含まれます。
メソッド
have_http_status "ステータスコード(例:302等)"
HTTPステータスコードが一致しているかテストします。
render_template
指定したテンプレートがレンダリングされているかテストできます。「rails-controller-testing」というGemをインストールすることで利用可能になります。
be_a_new
新しいオブジェクトが設定されているかチェックできます。
この記事へのコメントはありません。