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


これは何?

【初心者向け】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)


参考