【Rails】rspecでAPIのテストを作成する

この記事は以下の記事の続きです

【Rails】簡単API作成 - 凸ろぐ

こちらを参考にさせていただきました。

RailsでAPI作成とAPIのテストのまとめ - Rails Webook

rspecAPIのテストを作成する

Gemfileに以下を追加。

group :development, :test do
  gem "rspec-rails"
end

rspec-railsをインストール

$ bundle install

以下でrspecをインストールして、

$ rails g rspec:install

以下でテスト用ファイルを生成

$ rails g rspec:integration Driver
      create  spec/requests/drivers_spec.rb

rspecはもう何ヶ月も前に一回だけ雑誌で取り上げられたチュートリアルをやったっきりだったので全く抜け落ちていた...。

今回はAPI名前空間を作成した場合に対応したrspecのテストファイルを書いていく。

以下のように、apiのテストはspec/requestsディレクトリにいれましょう。

specファイルはspecディレクトリのサブディレクトリに適宜分類して配置します。どのサブディレクトリにどんなspecファイルを置くかは慣習的に決まっています。たとえば、モデルクラスに関するspecファイルはspec/modelsディレクトリに、APIに関するspecファイルはspec/requestsディレクトリに置くのが一般的です。

RailsのテストフレームワークRSpecの基礎知識 | Think IT(シンクイット)

そしてFactoryGirlというライブラリを使うらしいので、そちらも勉強。テストろくに書いてこなかったのを今更後悔してる。。

以下が公式チュートリアル

factory_girl/GETTING_STARTED.md at master · thoughtbot/factory_girl · GitHub

qiitaでもどなたかがまとめてくださってる。

RSpecにおけるFactoryGirlの使い方まとめ - Qiita

このFactoryGirlはRailsでのテストでよく用いられるライブラリだけど、"Fixture Replacement"というものらしい。

以下をGemfileに追加して$ bundle installする。

group :development, :test do
  gem "factory_girl_rails", "~> 4.0"
end

rspec/spec_helper.rbに以下を追加。

require 'factory_girl_rails'

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
  ...

spec/factory.rbを作成して以下を記述。シンボルから自動的にクラスを見つければ、勝手に個別のデータを作成してくれるのかな(よくわかってない。)

FactoryGirl.define do
  factory :driver do
  end
end

この記事とかすごく参考になるので2、3もまた見ておく。

factory_girlを試してみた(基礎編) - miyohide's blog

そして肝心なテストプログラム。今回はDriverモデルに格納されてるデータの数と1番目、2番目のIDを照合してる感じ。

require 'rails_helper'

RSpec.describe "Drivers", type: :request do
  describe "GET api/drivers" do

    before { @drivers = FactoryGirl.create_list(:driver, 2) }

    it "if getting drivers list" do
      # When access GET api/drivers 
      get api_drivers_path

      # Check status code 
      expect(response.status).to eq 200

      # Check JSON
      json = JSON.parse(response.body)
      expect(json.size).to    eq @drivers.count
      expect(json[0]["id"]).to eq @drivers[0].id
      expect(json[1]["id"]).to eq @drivers[1].id
      
      # and other detailed attributes...
    end

  end
end

以下のようになれば成功!

▶ bundle exec rspec spec/requests/drivers_spec.rb
.

Finished in 0.19006 seconds (files took 7.27 seconds to load)
1 example, 0 failures

rspecの基礎の勉強にもなったしよかった。もっともっとがっつり使って理解を深めないといけない感は半端じゃないけど。