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 タスクを実行するにはどうすればよいでしょうか?
ありがとう!:)