【Rails】rspecでAPIのテストを作成する
この記事は以下の記事の続きです
こちらを参考にさせていただきました。
RailsでAPI作成とAPIのテストのまとめ - Rails Webook
rspecでAPIのテストを作成する
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の基礎の勉強にもなったしよかった。もっともっとがっつり使って理解を深めないといけない感は半端じゃないけど。