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

# これは何？
[【初心者向け】RailsでAPI開発 Part.4](https://qiita.com/jiggaman0412/items/d71cb0f54ac850128e21)の続きです。
今回は最後で、テストコード編です。

# 概要
## ▼ 仕組み
1. 全モデルのテスト（Model Spec）
2. 全リクエストのテスト（Request Spec）

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

## ▼ 使用するもの
- rspec-rails
    - RSpec
- factory_bot_rails
    - テストDB用のサンプルデータ作成

# 手順
## ① RSpecの準備
```text:Gemfile
group :development, :test do
 gem 'rspec-rails'
end
```

```text:terminal
bundle install
bundle exec rails g rspec:install
bundle exec rails g rspec:model user
```

```text:.rspec
--require spec_helper
--format documentation
```

```text:spec/models/user_spec.rb
require 'rails_helper'

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

```text:terminal
bundle exec rspec
```

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

## ② Factoryの準備
```text:Gemfile
group :development, :test do
 gem 'rspec-rails'
 gem 'factory_bot_rails'
end
```

```text:terminal
bundle install
bundle exec rails g factory_bot:model user
```

```ruby: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を書く
```ruby: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`よりもより本番に近いテストができるのでこちらがおすすめです。
認証と認可のテストだけ記述します。

```text:terminal
bundle exec rails g rspec:request user
```

```ruby: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 Header`や`Record Not Found`や`No Authentication`のテストもしたほうがいいので、
そちらはご自分で記載をしてみてください。

# まとめ
テストの基礎的な書き方などは伊藤先生が出している[RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)が非常に参考になります。
ここではRSpecの書き方などの解説はしていませんので悪しからず。

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

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

# 参考
- [使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」
](https://qiita.com/jnchito/items/42193d066bd61c740612)
- [Rails: ActiveModelSerializersでAPIを作る–Part 2 RSpec編（翻訳）
](https://techracho.bpsinc.jp/hachi8833/2017_10_03/45639)