LoginSignup
6
6

More than 5 years have passed since last update.

railsでgrape と RSpecでapiのTest

Posted at

はじめに

grapeで作成したapiをRSpecを用いてtestする方法の導入について書きます。
apiは実装済みを想定していて、今回は
/api/v1/users
User.allを返すapiがあるとします。

なお、私が利用しているrspecのversionは3.4です。(version 3で書き方が変わったようです)

rspec-railsのインストールとセットアップ

本家githubを見ればわかると思いますが、ここにも書きます。

  • Gemfileに追記
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で見つけてくれませんでした。

  1. status codeは200が返ってくる
  2. 返ってくるjsonはArray型である
  3. Arrayの中身はUserテーブル内にデータとして存在する
spec/api/users_spec.rb
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もテスト駆動開発も始めたばかりなので、もっと調べないと。。。
この辺読んで勉強します。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6