はじめに
今回は、GitHubにpushした時出たerrorについてメモをまとめます。
今回遭遇したerrorは、LintError,TestErrorです。
最初と最後にエラーの確認でするコマンド↓
bash
$ bin/rails test
準備すること
user.ymlを無効化する
今は、何もデータの記載がないのでそのままでもいいんですが、
念の為読み込まない様にする。
bash
$ mv test/fixtures/users.yml test/fixtures/users.yml.backup
FactoryBotを設定する
Gemfielに追加をする
その後bundle installでインストールをする。
Gemfile
group :development, :test do
gem 'factory_bot_rails'
end
Factoryファイルを作成
bash
$ mkdir test/factories
$ touch test/factories/user.rb
user.rb
FactoryBot.define do
factory :user do
sequence(:email) { |n| "user#{n}@example.com" } # ユニークなemailを生成
password { "password" } # 必要に応じて変更
end
end
LintError(コードスタイル)
エラー内容
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
$ rubocop -a
TestError(データーベース重複)
エラー内容
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
$ bin/rails db:test:prepare
補足
今回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の場合
test/test_helper.rb
require "devise/test/integration_helpers" #追加 Deviseのテストヘルパーをインクルードする
class ActiveSupport::TestCase
include Devise::Test::IntegrationHelpers #追加 テスト用のヘルパーを読み込む
end
テストコードの修正
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