はじめに
grapeで作成したapiをRSpecを用いてtestする方法の導入について書きます。
apiは実装済みを想定していて、今回は
/api/v1/users
でUser.all
を返すapiがあるとします。
なお、私が利用しているrspecのversionは3.4です。(version 3で書き方が変わったようです)
rspec-railsのインストールとセットアップ
本家githubを見ればわかると思いますが、ここにも書きます。
- Gemfileに追記
group :development, :test do
gem 'rspec-rails', '~> 3.0'
end
$bundle install
$rails generate rspec:install
これで、rpecのインストールとセットアップ完了です。
$bundle exec rspec
でテストを実行できます。(今は0個ですが)
api用のテストコード作成
セットアップした際にspecディレクトリが作成されます。
その下にapiディレクトリを作成し、さらにusers_spec.rb(名前は自由)を作成します。
あとはテストコードを書くだけです。
テストコードの書き方は下記を参照すると良さそうでした。
今回はサンプルとして、/api/v1/users
にアクセスすると下記の3つに関してテストするコードを記します。
User.allと同一であるとかのテストはめんどいのでしません。
返ってくるjsonの中のcreated_atとupdated_atを消さないとfind_byで見つけてくれませんでした。
- status codeは200が返ってくる
- 返ってくるjsonはArray型である
- Arrayの中身はUserテーブル内にデータとして存在する
require 'rails_helper'
describe "users api", :type => :request do
it "returns users list" do
User.create(name: "hoge", email: "hoge@examle.com")
User.create(name: "piyo", email: "piyo@examle.com")
User.create(name: "fuga", email: "fuga@examle.com")
get "/api/v1/users"
expect(response.status).to eq 200
body = JSON.parse(response.body)
expect(body).to be_an_instance_of Array
body.each { |u|
u.delete("created_at")
u.delete("updated_at")
expect(User.find_by(u)).to_not be_nil
#expect(User.find_by(id: u["id"], name: u["name"], email: u["email"])).to_not be_nil
}
end
end
最後に
まだrailsもテスト駆動開発も始めたばかりなので、もっと調べないと。。。
この辺読んで勉強します。