16

lib/tasksフォルダーに次の rake タスクが定義されています。

namespace :db do
  namespace :test do
    task :prepare => :environment do
      Rake::Task["db:seed"].invoke
    end
  end
end

さて、これが行うことは、実行時にテスト DB をシードすることrake db:test:prepareです。これを行うのは、アプリが機能するために存在しなければならないいくつかの基本的なレコードがあるためです。これらはオプションではなく、実際にモックすることはできません。

これとは別に、開発と本番でアセット ストレージに S3 を使用するモデルがありますが、テストには S3 を使用したくありません。モデルに、ストレージ パスを S3 からローカルに変更するメソッドを設定しました。Rails.env.test?

ただし、これは機能しません。rake タスクが呼び出された環境を認識しているかどうか疑問に思っていましたが、そうではないことが判明しました。これをseeds.rbファイルの先頭に置きます:

puts "Environment Check: Rails Environment = #{Rails.env}"

案の定、タスクを実行すると、次のように出力されます。Environment Check: Rails Environment = development

では、テスト DB をシードしているときに、テスト DB をシードしていることを認識できるように、この rake タスクをやり直すにはどうすればよいでしょうか??

4

2 に答える 2

15

私もこの問題を抱えていました。私のファイルには、開発環境でユーザーアカウントを作成するブロックがありますが、RSpecまたはCucumberテスト用db/seeds.rbに実行するテスト環境を準備するときにも作成されていたため、壁が赤くなりました。rake

更新rakeタスクの環境を指定する最良の方法は、タスク内の環境を指定することであり、とりわけ、環境を設定する必要があるステートメントを指定することです。したがって、この場合:

Rails.env = 'test'
Rake::Task["db:seed"].invoke

仕事をします。

于 2011-04-29T21:17:19.603 に答える
8

db:test タスクの sourceを読むと、database.yml からテスト db 情報を取得することのみを気にしているように見えますが、実際にどの環境で実行しているかは気にしません。

テスト環境にいることを確認するために、 rake db:test:prepare RAILS_ENV=test を実行する必要がある場合があります。

于 2011-04-03T01:48:05.793 に答える