自転車とプログラミング

元自転車メーカーのマーケター、今は自社開発企業に勤めるエンジニアが主にプログラミングの話を書きます。

「Everyday Rails - RSpecによるRailsテスト入門」でRSpecを学ぶ 導入〜リクエストスペック編

こんにちは、watanabeです。 RSpecの学習ブログの第二回です。

今回はリクエストスペック編です。ブラウザサイドのリクエストに対するレスポンスに関するテストをおこないます。

リクエストスペックと現在はあまり使われなくなったコントローラスペック

リクエストスペックとは別にコントローラスペックというものもRSpecには標準で用意されています。こちらはコントローラに定義されたアクションに関するテストです。現在はあまり使われなくなっているそうです。

コントローラスペックはアクションの実装・動作をテストするものが主となりますが、それはふるまいを主にテストするRSpecの方向性とは異なるものです。 本来的にはコントローラのテストというのはクライアントから送られるリクエストに対して何をレスポンスするか、というインターフェースを確認できればよいはずで、以前よりコントローラスペックは使われなくなり、リクエストスペックが使われるようになっています。

リクエストスペックはそれはそれで外部向けAPIのためにつくられたっぽいニュアンスが教材に書いてあるので、「コントローラをテストする必要ないんじゃね?リクエストスペックでコントローラもテストしようぜ」という歴史の流れがあったんじゃないでしょうか?※想像です。

リクエストスペックの書き方

リクエストスペックはその名の通り、クライアントからのリクエストとサーバからのレスポンスをテストします。ですので、HTTPメソッド(get, post, delete, patchなど)を使用します。

  it 'loads a project' do
    user = FactoryBot.create(:user)
    FactoryBot.create(:project, name: "Sample Project")
    FactoryBot.create(:project, name: "Second Sample Project", owner: user)

    get api_projects_path, params: {
      user_email: user.email,
      user_token: user.authentication_token
    }

    expect(response).to have_http_status(:success)
    json = JSON.parse(response.body)
    expect(json.length).to eq 1
    project_id = json[0]["id"]

    get api_project_path(project_id), params: {
      user_email: user.email,
      user_token: user.authentication_token
    }

    expect(response).to have_http_status(:success)
    json = JSON.parse(response.body)
    expect(json["name"]).to eq "Second Sample Project"
    # Etc.
  end

getで取得したレスポンスが正常かどうか、その中身が正しいかをテストしています。

      it "adds a project" do
        project_params = FactoryBot.attributes_for(:project)
        sign_in @user
        expect {
          post projects_path, params: { project: project_params }
        }.to change(@user.projects, :count).by(1)
      end

postリクエストによって生成しようとしたプロジェクトが実際に増えているかをテストしています。

このような感じで通常のHTMLやデータを返すgetアクションに対してはレスポンスが正常かどうか、データを保持しているかどうかを確認できると良さそうです。postやdelete, putchを用いる場合はレスポンスの正常性に加えて、データの変化をテストできると良さそうです。

教材はこちら

RSpec初心者の教材としては定番?の「Everyday Rails - RSpecによるRailsテスト入門」を使っています。 フィヨルドブートキャンプのメンター兼ソニックガーデンのエンジニアをされている伊藤淳一さんが訳をされています。 Rails7に対応修正した初心者〜中級者向けの内容となっているので信頼度が高いかなと思います。

leanpub.com