次のキュウリステップを持つプロジェクトに取り組んでいます:
Given /^no registered users$/ do
User.delete_all
end
User
テーブルに実際のデータがあるため、開発データベースでテストしていても、新しい RoR ユーザーとしては少し危険に見えます。コード行は何をしていますか?
ありがとう!
次のキュウリステップを持つプロジェクトに取り組んでいます:
Given /^no registered users$/ do
User.delete_all
end
User
テーブルに実際のデータがあるため、開発データベースでテストしていても、新しい RoR ユーザーとしては少し危険に見えます。コード行は何をしていますか?
ありがとう!
delete_all は、FactoryGirl からではなく、activerecord ライブラリからのものです。
そして、これら2つの違いは次のとおりです。
一度に多数のレコードを削除する場合、各レコードのインスタンス化、コールバックの実行、および削除に時間がかかることがあります。レコードごとに少なくとも 1 つの SQL DELETE クエリを生成します。関連付けやコールバックを気にせずに多数の行をすばやく削除したい場合は、代わりに delete_all を使用してください。
delete_all
FactoryGirl からのものではなく、アクティブな記録コマンドであり、データベースからユーザーを削除します。これをキュウリから実行している場合は、開発ではなく、テスト データベースに対して実行する必要があります。
destroy_all
そのバージョンは関連するコールバックを実行するので、より良い代替手段です。たとえば、ユーザーに投稿があり、before_destroy
ユーザーが削除された場合に投稿を削除するためのコールバックがあるとします。
についての詳細情報へのリンクは次のとおりです。delete_all
delete_all
Railsコールバックをアクティブにすることなく、対応するテーブルからレコードを強制的に削除します。
destroy_all
レコードを削除しますが、モデルのコールバックも呼び出します
あなたの例に基づいて、次のCucumberステップで新しいユーザーを登録できるようにするために、おそらくすべてのユーザーを削除しています。ActiveRecord::Base#delete_all メソッドは、部分的に次のように述べています。
最初にレコードをインスタンス化せずに、条件に一致するレコードを削除します。したがって、destroy メソッドを呼び出したり、コールバックを呼び出したりしません。これは、データベースに直接送信される単一の SQL DELETE ステートメントであり、destroy_all よりもはるかに効率的です。
そのテストを作成するためのより良い方法はおそらくありますが、その意図は明らかにユーザー レコードを可能な限り効率的に削除することです。
危険であることについては、テストは、開発または運用データベースではなく、テスト データベースに対して実行する必要があります。Rails.env.test?
間違ったデータベースを使用するようにテスト フレームワークを誤って構成する可能性があるため、 trueかどうかをテストするステップまたは条件を追加できます。心の安らぎを得るには、かなり小さな代償です。