これは何?
【初心者向け】RailsでAPI開発 Part.4の続きです。
今回は最後で、テストコード編です。
概要
▼ 仕組み
- 全モデルのテスト(Model Spec)
- 全リクエストのテスト(Request Spec)
上記の二つをテストすることで信頼に足るAPIが提供できているかを確認します。
副次的な効果として、テストはドキュメントとしても有効です。
▼ 使用するもの
- rspec-rails
- RSpec
- factory_bot_rails
- テストDB用のサンプルデータ作成
手順
① RSpecの準備
group :development, :test do
gem 'rspec-rails'
end
bundle install
bundle exec rails g rspec:install
bundle exec rails g rspec:model user
--require spec_helper
--format documentation
require 'rails_helper'
RSpec.describe User, type: :model do
it "is valid with a name, email and password"
end
bundle exec rspec
最後に打ち込んだコマンドでしっかりとRSpecが起動していることが確認できたらOK。
② Factoryの準備
group :development, :test do
gem 'rspec-rails'
gem 'factory_bot_rails'
end
bundle install
bundle exec rails g factory_bot:model user
FactoryBot.define do
factory :user do
name { "jiggaman" }
sequence(:email) { |i| "sample-#{i}@mail.com" }
password { "password" }
end
end
ここでは下準備だけで、次回にFactoryがしっかりと機能しているかを確認する。
③ Model Specを書く
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
よりもより本番に近いテストができるのでこちらがおすすめです。
認証と認可のテストだけ記述します。
bundle exec rails g rspec:request user
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 Header
やRecord Not Found
やNo Authentication
のテストもしたほうがいいので、
そちらはご自分で記載をしてみてください。
まとめ
テストの基礎的な書き方などは伊藤先生が出しているRSpecによるRailsテスト入門が非常に参考になります。
ここではRSpecの書き方などの解説はしていませんので悪しからず。
ただ、本番用のアプリケーションを開発するまでに、どう準備をして、何をテストすればいいかなどの大枠が掴んでもらえればと思います。
総まとめ
全5回に渡って初心者向けにRailsでスマホアプリ開発のためにAPI開発をするにはどうしたらいいのか?という部分を解説してきました。
僕自身がまず初心者なので至らない点もたくさんありますが読んでいただきありがとうございます。
僕はこれからこれを踏まえて実際に本番用アプリを開発していきます。(不安だらけですw)