プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Ruby on Rails
  • 【Rspec】「Controller Spec(コントローラスペック)」の基本
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Rspec】「Controller Spec(コントローラスペック)」の基本

12.30

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

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

新しいオブジェクトが設定されているかチェックできます。

スポンサーリンク
  • 2019 12.30
  • miyabisan2
  • コメントを書く
  • Rspec, Ruby on Rails
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2018 06.20

    【Ruby on Rails】ページごとに、読み込まれるCSSとJavaScriptを変えるには?(Rails5まで)

  2. 2019 12.07

    【Ruby on Rails】CSVインポートやエクスポート機能について

  3. 2020 03.21

    【RSpec】「Shoulda Matchers」について

  4. 2020 07.18

    【Ruby on Rails】「ActionText」のリッチテキストを使う

  5. 2020 11.29

    【Ruby on Rails】「ActiveModel」、「フォームオブジェクト」、「EachValidator」、「単一テーブル継承(STI)」

  6. 2018 06.20

    【Ruby on Rails】レイアウトの共通デザインを定義する。

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Ruby on Rails】「Model Spec(…

【Docker】Dockerイメージの基本、「タグ」に…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー