GitHub Errorに遭遇した時の話

## はじめに:point_up:
今回は、*GitHub*に*push*した時出た*error*についてメモをまとめます。
今回遭遇した*error*は、**LintError**,**TestError**です。
###### 最初と最後にエラーの確認でするコマンド↓
```bash:bash
$ bin/rails test
```

### 準備すること:clap:
###### user.ymlを無効化する
今は、何もデータの記載がないのでそのままでもいいんですが、
念の為読み込まない様にする。
```bash:bash
$ mv test/fixtures/users.yml test/fixtures/users.yml.backup
```

###### FactoryBotを設定する
Gemfielに追加をする
その後**bundle install**でインストールをする。
```rubu:Gemfile
group :development, :test do
  gem 'factory_bot_rails'
end
```

###### Factoryファイルを作成
```bash:bash
$ mkdir test/factories
$ touch test/factories/user.rb
```
```ruby:user.rb
FactoryBot.define do
  factory :user do
    sequence(:email) { |n| "user#{n}@example.com" } # ユニークなemailを生成
    password { "password" } # 必要に応じて変更
  end
end
```

---
### LintError(コードスタイル)
```bash:エラー内容
Error: Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.
Error: Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.
Error: Layout/SpaceInsideArrayLiteralBrackets: Use space inside array brackets.
Error: Layout/SpaceInsideArrayLiteralBrackets: Use space inside array brackets.
Error: Layout/SpaceInsideArrayLiteralBrackets: Use space inside array brackets.
Error: Layout/SpaceInsideArrayLiteralBrackets: Use space inside array brackets.
Error: Layout/SpaceInsideArrayLiteralBrackets: Use space inside array brackets.
Error: Layout/SpaceInsideArrayLiteralBrackets: Use space inside array brackets.
Error: Layout/EmptyLinesAroundBlockBody: Extra empty line detected at block body end.
Error: Process completed with exit code 1.
```
今回は、RuboCopが以下のようなスタイル違反を報告：
* シングルクオート（'）ではなくダブルクオート（"）を使用
* 配列の括弧内にスペースを入れる
* ブロック終端に余分な空行がある

###### 対処法
* 自動修正可能な箇所は修正され、それ以外は手動で対応
```bash:bash
$ rubocop -a
```

### TestError(データーベース重複)
```bash:エラー内容
bin/rails test test/controllers/top_controller_test.rb:4



Finished in 0.087763s, 11.3943 runs/s, 0.0000 assertions/s.
1 runs, 0 assertions, 0 failures, 1 errors, 0 skips
Error: Process completed with exit code 1.
```
* テスト中に、ユーザーのemailフィールドがユニーク制約に違反
* test/fixtures/users.ymlでデータが重複していた

###### 対応方法
* FactoryBotをインストールし、ユニークなデータを動的に生成するよう変更
* テストデータベースをリセットしてクリーンな状態に

###### データーベースのリセット
全てし終わったらテスト環境のデーターベースをリセットして、
最新の状態にする。
```bash:bash
$ bin/rails db:test:prepare
```

__________
##### 補足:ear:
今回*Gem*で*Devise*も入れていたのでそれ関連の*Error*も追記します。
###### Error内容
```
Error:
TopControllerTest#test_should_get_index:
NoMethodError: undefined method `sign_in' for #<TopControllerTest:0x0000ffff7806a130>
    test/controllers/top_controller_test.rb:9:in `block in <class:TopControllerTest>'
```
注目するべき分→ **undefined method 'sign_in'**
* sign_inメソッドが未設定のため、認証テストでエラーが発生
* Deviseのテスト用ヘルパーをtest/test_helper.rbに追加し解決

###### Minitestの場合
```ruby:test/test_helper.rb
require "devise/test/integration_helpers" #追加 Deviseのテストヘルパーをインクルードする
class ActiveSupport::TestCase
  include Devise::Test::IntegrationHelpers #追加 テスト用のヘルパーを読み込む
end
```
###### テストコードの修正
```ruby:test/controllers/top_controoler_test.rb
require "test_helper"

class TopControllerTest < ActionDispatch::IntegrationTest
  test "should get index" do
    user = FactoryBot.create(:user) # ユーザーをFactoryBotで作成
    sign_in user # Deviseの認証

    get root_path # テスト対象のリクエスト
    assert_response :success
  end
end
```
##### 最後に$ bin/rails testをしてエラーが出なかったら成功でした。