概要
Railsのテストを実行した際に、Could not find table というエラーが起きる場合があります。
本記事では、このエラーがなぜ起きるのか、どう解決するのかを解説します。
この記事で伝えたいこと
- Could not find tableのエラーが起きる理由
- Could not find tablエラーを解決する方法
実行したテスト
ユーザインスタンスを作成し、ユーザが有効かどうか検証する。
class UserTest < ActiveSupport::TestCase
# 事前に、ユーザインスタンスに名前等の各値を設定する
# setupメソッドは、テスト実行時に自動で実行される
def setup
@user = User.new(name: "Emi", email: "emi@a.com", password: "fooooo", password_confirmation: "fooooo")
end
test "should be valid" do
assert @user.valid?
end
...
end
発生したエラー
テスト実行時に、テーブルが存在しないというエラーが発生します。
下記のActiveRecord::StatementInvalid
とは、ActiveRecord(モデル)がデータベースにクエリ(命令)を実行した際に発生するエラーです。
Error:
UserTest#test_should_be_valid:
ActiveRecord::StatementInvalid: Could not find table 'tag_relations'
ActiveRecordとは
ビジネスデータ(データベースに保存される顧客情報等のデータ)と、ビジネスロジック(データをどう操作するかが書かれた処理)を操作する役割。
簡単に言うと、Modelとデータベースのやり取りがスムーズになるように、仲介する役割。
エラーが起きる原因
test_helper.rb
でフィクスチャファイルを読み込む設定になっているのに、フィクスチャファイルで適切な設定がされていません。
以下の、 fixtures :all
で、全てのフィクスチャファイルを読み込む設定になっています。
# test_helper.rb
module ActiveSupport
class TestCase
...
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
fixtures :all
...
end
end
test_helper.rbとは
テスト全体で使用したい設定を保存するファイル。
フィクスチャファイルとは
- テストデータベース用のサンプルデータのことで。
- フィクスチャを使用すると、事前に定義したデータを、テスト実行直前にテストデータベースに導入できます。
エラーを解決する方法
解決方法の種類
エラーを解決する方法として、以下の3つがあります。
今回のテストではデータベース内のデータが必要ないため、2のフィクスチャを無効化する方法を行います。
1.フィクスチャを設定する
事前にデータベースにデータが必要な場合(データの永続化が必要な場合)は、フィクスチャを使用。
2. フィクスチャを無効化する
データベースにデータが必要ない場合は、フィクスチャを無効化する。
3. FactoryBotを使用する
複数のモデルで関連づけや、attribute(型の変換や、デフォルト値を設定)が異なるデータを多く作成する場合に使用。
フィクスチャを使用すべきかの判断は、下記のサイトが参考になります。
フィクスチャ無効化の方法
test_helper.rbをコメントアウトする。
フィクスチャの使用を無効化すると、フィクスチャのテストが通るようになります。
# test_helper.rb
module ActiveSupport
class TestCase
...
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
#fixtures :all
...
end
end
フィクスチャ無効化のデメリット
テスト実行時にデータベースにデータが必要な場合は、フィクスチャやFactoryBotを使用する必要があります。