Rails APIサーバー開発時に入れたGemの使い方 (rack-cors, rspec-rails, factory_bot_rails, rubocop)

# 前提
[docker-composeを用いたRailsのAPIサーバー環境構築](https://qiita.com/Teach/items/69a1e43562c0682b6777)
この記事でGemについてはあまり触れなかったので続き

# Gemfileの編集

下記のGemをインストールする。

```Gemfile
...
gem 'rack-cors'

group :development, :test do
...
  gem 'rspec-rails', '~> 3.9'
  gem 'factory_bot_rails'
end

group :development do
...
  gem 'rubocop', require: false
end
```

# rack-cors
postman使う時に必要。
やっておかないとCORS問題発生してエラー出る。

config > initializers > cors.rb
を以下のように書くと、どこからでもAPI叩けるようになる。

```cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'

    resource '*',
             headers: :any,
             methods: %i[get post put patch delete options head]
  end
end
```

# rspec-rails, factory_bot_rails
モデルやコントローラーをgenerateするときに自動生成するファイルがあるのであらかじめ入れておいた方が良い。

[rspec-rails GitHub](https://github.com/rspec/rspec-rails/tree/v3.9.1)
Rails 5ではrspec-railsの3系を使用する。(Rails 6では4~)

bundler installしたら、以下で初期ファイル？インストール

```
rails generate rspec:install
…
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
```

また以下を追加

参照 [RailsアプリへのRspecとFactory_botの導入手順](https://qiita.com/Ushinji/items/522ed01c9c14b680222c)

```rails_helper.rb
RSpec.configure do |config|
...
  config.include FactoryBot::Syntax::Methods
end
```


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

```application.rb
    config.generators do |g|
      g.test_framework :rspec,
                       view_specs: false,
                       helper_specs: false,
                       controller_specs: false,
                       routing_specs: false
```

モデルのテストは自動生成されたが、
結合テストは[Request spec](https://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec)で書くために手動でファイルを作った。

spec > requests > hoge_api_spec.rb
のように名付けた。

リクエストスペックは以下のような構成で書いた

```hoge_spec.rb
RSpec.describe 'HogeAPI' do
  describe 'POST #create' do # アクション名を示す
    context 'xxxな場合' do　# 条件
      before do
        # ダミーのデータを用意
        FactoryBot.create(:hoge)
        ...
      end

      it 'yyする' do
        expect do # DBの変更を検知するときはくくる
          post '/hoge/create', params: { name: "Hoge" }
        end.to change(Hoge, :count).by(+1) and change(Table2, :count).by(0)
        expect(response.status).to eq(201) # ステータスコードの確認
      end
    end
```

#### 参考

[【rspec】Railsモデルテストの基本](https://qiita.com/AK4747471/items/1b7b4af1e6d102625562)
[【Rails】APIテストの書き方](https://qiita.com/k-penguin-sato/items/defdb828bd54729272ad)
[RSpecを使ってAPIのテストを行う](https://qiita.com/yupsy/items/c7f09e7a92d22d27c312)
[Railsプロジェクトで、FactoryBotを用いたテストデータを作成する方法](https://www.yako-geppo.com/entry/rails-rspec-factorybot)



#### ダメだったapplication.rbの書き方
application.rbのgeneratorsはcontrollerを生成するためにcontrollerのテストファイルを生成しないようにしたいだけなので、
[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp/read#leanpub-auto-section-13)を参考に


```application.rb
# NG
    config.generators do |g|
      g.test_framework :rspec,
                       controller_specs: false
```
と最初は書いていたが、コントローラー生成は期待通りだったもののなぜかモデルのテストファイルがエラーで生成できなくなった。

# rubocop
rubocopはVSCodeでFormatする時にも使うのでローカルにもインストールした。

ファイルの書き方が正しいかどうかを確認してくれる。

```
// 確認したい時
rubocop

// 確認して直せるところは自動でなおすとき
rubocop -a
```

めっちゃ警告でるので、警告の内容をみて不要であればスキップするように設定する。

例

```.yml:.rubocop.yml
AllCops:
    Exclude: # 除外したいファイルは Exclude に指定する。
      - 'spec/*.rb'
      - 'db/schema.rb'
      - 'test/*'
      - 'config/**/*'
      - 'Gemfile'
      - 'bin/*'


Style/FrozenStringLiteralComment:
    Enabled: false

Style/Documentation:
    Enabled: false

Style/StringLiterals:
    Enabled: false

Metrics/BlockLength:
    Exclude:
        - 'spec/**/*'

Metrics/MethodLength:
    Max: 30

Metrics/AbcSize:
    Max: 30

Style/AsciiComments:
    Enabled: false
```
AllCopsは全ての警告に共通する設定


# 参考
[RailsでAPIにCORSを設定する](https://qiita.com/yumikokh/items/b5fd604e12720027b4d5)
[RuboCopをRailsオプションやLintオプションで使ってみよう](https://blog-ja.sideci.com/entry/2015/03/12/160441)