LoginSignup
6
7

More than 5 years have passed since last update.

【初心者向け】RailsでAPI開発 Part.5

Posted at

これは何?

【初心者向け】RailsでAPI開発 Part.4の続きです。
今回は最後で、テストコード編です。

概要

▼ 仕組み

  1. 全モデルのテスト(Model Spec)
  2. 全リクエストのテスト(Request Spec)

上記の二つをテストすることで信頼に足るAPIが提供できているかを確認します。
副次的な効果として、テストはドキュメントとしても有効です。

▼ 使用するもの

  • rspec-rails
    • RSpec
  • factory_bot_rails
    • テストDB用のサンプルデータ作成

手順

① RSpecの準備

Gemfile
group :development, :test do
 gem 'rspec-rails'
end
terminal
bundle install
bundle exec rails g rspec:install
bundle exec rails g rspec:model user
.rspec
--require spec_helper
--format documentation
spec/models/user_spec.rb
require 'rails_helper'

RSpec.describe User, type: :model do
 it "is valid with a name, email and password"
end
terminal
bundle exec rspec

最後に打ち込んだコマンドでしっかりとRSpecが起動していることが確認できたらOK。

② Factoryの準備

Gemfile
group :development, :test do
 gem 'rspec-rails'
 gem 'factory_bot_rails'
end
terminal
bundle install
bundle exec rails g factory_bot:model user
spec/factories/users.rb
FactoryBot.define do
 factory :user do
  name { "jiggaman" }
  sequence(:email) { |i| "sample-#{i}@mail.com" }
  password { "password" }
 end
end

ここでは下準備だけで、次回にFactoryがしっかりと機能しているかを確認する。

③ Model Specを書く

spec/models/user_spec.rb
it "is valid with a name, email and password" do
 user = FactoryBot.build(:user)
 expect(user).to be_valid
end

これでしっかりとテストが通れば下準備はOK。

④ Request Specを書く

APIの稼働チェックをする上で最も大事なのがこのRequest Specです。
Controller Specよりもより本番に近いテストができるのでこちらがおすすめです。
認証と認可のテストだけ記述します。

terminal
bundle exec rails g rspec:request user
spec/requests/users_spec.rb
require 'rails_helper'

RSpec.describe "Users", type: :request do
 describe "GET /v1/users" do
  it "works!" do
   user = FactoryBot.create(:user)
   get '/v1/users', headers: { 'Authorization' => "Token token=#{user.token}" }
   expect(response).to have_http_status(200)
  end
 end

 describe "GET /v1/users/:id" do
  it "works!" do
   user = FactoryBot.create(:user)
   get "/v1/users/#{user.id}", headers: { 'Authorization' => "Token token=#{user.token}" }
   expect(response).to have_http_status(200)
  end
  it "works!" do
   user = FactoryBot.create(:user)
   other_user = FactoryBot.create(:user)
   get "/v1/users/#{other_user.id}", headers: { 'Authorization' => "Token token=#{user.token}" }
   expect(response).to have_http_status(200)
  end
 end

 describe "DELETE /v1/users/:id" do
  it "works!" do
   user = FactoryBot.create(:user)
   delete "/v1/users/#{user.id}", headers: { 'Authorization' => "Token token=#{user.token}" }
   expect(response).to have_http_status(204)
  end
  it "does not work!" do
   user = FactoryBot.create(:user)
   other_user = FactoryBot.create(:user)
   delete "/v1/users/#{other_user.id}", headers: { 'Authorization' => "Token token=#{user.token}" }
   expect(response).to have_http_status(403)
  end
 end
end

当然、No HeaderRecord Not FoundNo Authenticationのテストもしたほうがいいので、
そちらはご自分で記載をしてみてください。

まとめ

テストの基礎的な書き方などは伊藤先生が出しているRSpecによるRailsテスト入門が非常に参考になります。
ここではRSpecの書き方などの解説はしていませんので悪しからず。

ただ、本番用のアプリケーションを開発するまでに、どう準備をして、何をテストすればいいかなどの大枠が掴んでもらえればと思います。

総まとめ

全5回に渡って初心者向けにRailsでスマホアプリ開発のためにAPI開発をするにはどうしたらいいのか?という部分を解説してきました。
僕自身がまず初心者なので至らない点もたくさんありますが読んでいただきありがとうございます。
僕はこれからこれを踏まえて実際に本番用アプリを開発していきます。(不安だらけですw)

参考

6
7
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
7