Rubyテスト(RSpec)コントローラー

zenkiです。

この記事ではRubyでのコントローラーのテストについてまとめたいと思います。

コントローラーのテストは主に「アクション内で定義したインスタンス変数の適切な取得」と「アクションが呼ばれた際に適切なビューが呼ばれるか」の二点を確認するために行います。

コントローラーのテストを行う際には、before_actionで定義した挙動などは無効にしておく必要があります。意図しないリダイレクトの発生などを防ぐためですね。

基本的なテストの書き方はモデルの時と同じです。rails_helperで共通の設定を呼び出し、以下の記述でテストを書いていきます。

describe ◯◯Controller do
  describe 'HTTPメソッド名 (get,post...)#アクション名' do
    it "インスタンス変数が適切なものか?" do
  "リクエストを行った体のコード"
      "エクスペクテーション"
    end

    it 適切なビューに遷移するかどうか?" do
      "リクエストを行った体のコード"
      "エクスペクテーション"
    end
  end

適切なビューに遷移するかのテストは、比較的単純な物になります。

~~~

describe PostsController, type: :controller do

  describe 'GET #new' do
    it "renders the :new template" do
      get :new
      expect(response).to render_template :new
    end
  end
end

newアクションの場合はこんな感じです。responseは遷移する先のビューの情報をもつインスタンスで、render_templateは引数にとったアクションが動いた際に自動的に設定されたビューを返します。ここではPostsコントローラーのnewアクションが動いた際に、new.html.hamlが呼び出されているかのテストが行われています。

次にアクション内で定義したインスタンス変数の適切な取得のテストですね。まず、モデルのテストの時と同じようにfactory_botで擬似データを設定します。

そのあとは、以下のように擬似インスタンスを作成しテストを書いていきます。

describe 'GET #edit' do
    it "assigns the requested post to @post" do
      post = create(:post)
      get :edit, params: { id: post }
      expect(assigns(:post)).to eq post
    end
end

以上です。