0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Railsのテストで、Could not find tableエラーを解決する方法

Posted at

概要

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(型の変換や、デフォルト値を設定)が異なるデータを多く作成する場合に使用。

フィクスチャを使用すべきかの判断は、下記のサイトが参考になります。

Rails Fixtures再考

フィクスチャ無効化の方法

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を使用する必要があります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?