0

Rails が提供する組み込みの単体テスト機能を使用してアプリをテストしています。問題は、1 つのテストが ID を使用した計算に大きく依存しており、それをテストする必要があることです。アクティブ レコードはトランザクションをロールバックするときに auto_increment をリセットしないため、ここでいくつかの問題が発生しています。

すべてのデータベース テーブルをリセットし、あたかもそのテストを実行したかのようにフィクスチャを再度ロードする方法があれば、問題は修正される可能性があります。

最初に、必要なすべての auto_increment 値を次のようにリセットするセットアップ メソッドを定義しようとします。

def setup
  ActiveRecord::Base.connection.execute("ALTER TABLE 'table_name1' AUTO_INCREMENT = 1;") 
  ActiveRecord::Base.connection.execute("ALTER TABLE 'table_name2' AUTO_INCREMENT = 1;")
end

しかし、テストはこの醜いエラーをスローして失敗しました:

ActiveRecord::StatementInvalid: Mysql::Error: SAVEPOINT active_record_1 が存在しません: ROLLBACK TO SAVEPOINT active_record_1

次に、setup メソッドで db:test:prepare と db:fixtures:load を呼び出そうとしましたが、これも失敗しました。さらに、setup メソッドはファイル内の各テストの前に実行されるため、テストが大幅に遅くなりますね。

では、特定のテスト スイートまたはテスト ファイル(呼び出し方がわからない)の直前にこれらの rake タスクを実行するにはどうすればよいでしょうか?

ありがとう!:)

4

2 に答える 2

2

テスト データベースを削除してから、実行してテスト内からデータベースを再作成できるはずですrake db:create RAILS_ENV=test。ただし、テストの途中でこれを行うと、有効なデータを使用してデータベースを再シードする必要があり、それが必要な場合は、お尻に大きな苦痛を与える可能性があります.

これを行うには、移行の「drop_table :table_name」を使用することもできます。

ただし、テストをそのような方法で記述したり、DB をそのように構成したりしないでください。特定の DB ID に依存しています。また、AUTO_INCREMENT 値をリセットするためだけに、テストでテーブル全体を再作成する必要もありません。これはほぼ確実に、テスト スイート ツールを設計どおりに使用していないことを示しています。しかし、それが完璧な世界ではないことも認識しており、これがある種の異常なエッジケースであることを願っています. :S

于 2011-05-04T16:45:17.077 に答える
0

database_cleaner gemを使用できます。次に、database_cleaner.rb で、ID を指定:pre_count:reset_idsてリセットできます。テスト環境にも別のデータベースを使用することをお勧めします。

于 2015-12-31T15:22:51.673 に答える