11

いくつかの環境固有の設定をテストしようとしています (特定のミドルウェアですが、問題ではないようです) が、正しい環境でテストを実行するのに問題があります。症状:

  • を実行すると、最初に require が実行され、環境が に設定され、Rails 環境が読み込まれるruby test/unit/my_test.rbため、すべて問題ありません。test/test_helper.rb"test"
  • を実行するrake testと、最初のバッチ (機能) は正常に実行されますが、2 番目のバッチ (ユニット) は失敗します。失敗は、ENV['RAILS_ENV]何らかの理由でバッチ間で設定が解除されconfig/environment.rb、何も設定されていないことがわかり、デフォルトの を使用することです"development"。環境はconfig/environment.rb、そのファイルの構成ブロックの先頭と先頭では正しいですが、最後まで間違っています。を使用するputsか削除するconfig/development.rbと、ファイルが見つからないことがわかります。
  • を実行するrake test:unitsと、 の 2 番目のバッチと同じ問題が発生しますrake test(つまり、すべて失敗します)。
  • を実行するrake test:functionalsと、の場合と同じになりますrake test:units
  • rake test RAILS_ENV=testまたはrake test:units RAILS_ENV=testまたはを実行するrake test:functionals RAILS_ENV=testと、すべて問題ありません。

私が試したことがまったく機能しないことの1つは、次のとおりです。

# in Rakefile:
task :set_test_env { ENV['RAILS_ENV'] = 'test' }
Rake::Task[:test].prerequisites.unshift :set_test_env
# and similarly for other test tasks

テスト タスクごと:set_test_envにこれらのタスクを個別に作成して、一度だけではなく各タスクの前に呼び出されるようにしました。まだサイコロはありません。それ呼び出され、環境は最初は正しいですが、内部で何かがうまくいきません。config/environment.rb

ENV['RAILS_ENV']コードに設定する呼び出しはどこにもありません。

4

5 に答える 5

5

完全な答えを出すには、コードを確認する必要がありますが、役立つかもしれないいくつかの手がかりを提供しようと思います。

まず第一に、rake test他のすべてのバリアント(など)は次のように機能しますtest:unitstest:functionals

  1. レーキプロセスが呼び出され、タスクが現在の環境(デフォルトでは開発)でtest実行されるため、常に読み取られます。development.rb
  2. Rakeタスクは、別の子プロセスでテストローダーをps呼び出します(これはまたはで確認できますpstree)。ここで、test_helper.rbがソースになり、環境がテストに設定されます。

実行ruby test/unit/my_test.rbすると最初のステップがスキップされるため、問題はそこにあるように見えます。development.rbたぶん、サブプロセスに副作用がある何かをしますか?

于 2009-08-04T18:47:06.347 に答える
2

特にENV['RAILS_ENV']が一般的なデフォルトのいずれかに設定されている場合(壊滅的な事故を避けるため)、私はほとんどの場合、テスト自体とその前提条件を「テスト」環境で実行するように強制したいと考えていますが、rake test:units RAILS_ENV=v_2_0_maint_testコマンドラインで呼び出して、たとえば「v_2_0_maint_test」などの名前の環境でテストを実行できます。

したがって、関心のある各テスト タスクの前に前提条件を追加する test_tasks.rake ファイルがあります。同じ環境。これは、影響を与えたいテストその前提条件のみに影響を与えるという美徳を主張しています。

namespace :test do |n|
  [ n[:units], n[:functionals], n[:integration] ].each do |t|
    t.prerequisites.unshift(:set_test_env_dammit)
  end

  task :set_test_env_dammit do |t|
    if [ nil, "", "development", "staging", "production" ].index ENV['RAILS_ENV']
      RAILS_ENV = "test"
    end
  end
end
于 2010-06-17T15:39:30.977 に答える
0

test_helper.rb ファイルの上部にコードがあります

ENV["RAILS_ENV"] = "test"

その行がない場合、システムの問題はデフォルト環境 (つまり、開発) で実行されます。

于 2009-06-13T21:52:19.667 に答える
0

プロジェクト全体で RAILS_ENV とそのバリアントを検索します。アプリケーションまたはテストのどこかに設定しているかどうかを確認してください。

また、どのプラットフォームで実行していますか? 別のマシンでテストを実行して、結果が同じかどうかを確認できますか?

これが比較的最近の開発であり、Git や SVN などの RCS を使用している場合は、最近のコミットに目を通し、特に Git を使用している場合は、git bisect を調べる必要があります。RCS を使用していない場合は、使用する必要があります。

これが本当に新しいアプリの問題である場合は、環境に問題がある可能性があります。

どのプラグインと gem をインストール/構成しましたか? バックトレースを見ることができますか?

于 2009-07-30T01:00:01.693 に答える
-1

私はあなたがここで問題を抱えているとはまったく信じていません。ある時点で、レーキ タスクが実際に開発環境にヒットしていることに気付き、なぜそうなったのかを理解しようとし始めたと思います。次に、開発構成ファイル内に例外を発生させる行を追加しました。これが、rake テストが失敗する理由です。

例外が発生している行を削除すると、すべてのテストが正常に実行されることがあります。

以下を試してみると、問題が説明されていることがわかる場合があります。

  1. 環境を開発環境に設定します (トレースのためだけに)

    export RAILS_ENV=開発

  2. 環境ファイルで人為的に例外を発生させるすべての行を削除します。
  3. config/environments の各ファイルの末尾に次の行を追加します。

    puts "**** In #{ENV['RAILS_ENV']} environment config ****"
    
  4. テストする環境を設定する行のすぐ下の test/test_helper.rb に次の行を追加します。

    puts "**** Loading test helper **** Environment = #{ENV['RAILS_ENV']}"
    
  5. trace オプションを使用して rake を実行し、現在アクティブな環境のトレースでタスクの実行を監視します。

    rake -t test
    
  6. 出力を調べて、環境が正しく設定されていない場所を特定します。
  7. テストを再度実行しますが、今回は、テストを実行する前に環境を直接設定します。

    export RAILS_ENV=test

本当に問題がある場合は、rake -t の出力をトレース コードとともに投稿する必要があります。

これは、いくつかの最小限のテストを実施した新しいプロジェクトでの私のテストの出力です。実際のテストが実行される前は、環境は常に「テスト」であることに気付くでしょう。

** Invoke test (first_time)
** Execute test
** Invoke test:units (first_time)
** Invoke db:test:prepare (first_time)
** Invoke db:abort_if_pending_migrations (first_time)
** Invoke environment (first_time)
** Execute environment
**** In development environment config ****
** Execute db:abort_if_pending_migrations
** Execute db:test:prepare
** Invoke db:test:load (first_time)
** Invoke db:test:purge (first_time)
** Invoke environment
** Execute db:test:purge
** Execute db:test:load
** Invoke db:schema:load (first_time)
** Invoke environment
** Execute db:schema:load
** Execute test:units
**** Loading test helper **** Environment = test
**** In test environment config ****
Loaded suite /Library/Ruby/Gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
.
Finished in 0.071771 seconds.

1 tests, 1 assertions, 0 failures, 0 errors
** Invoke test:functionals (first_time)
** Invoke db:test:prepare
** Execute test:functionals
**** Loading test helper **** Environment = test
**** In test environment config ****
Loaded suite /Library/Ruby/Gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
.....
Finished in 0.133776 seconds.

5 tests, 6 assertions, 0 failures, 0 errors
** Invoke test:integration (first_time)
** Invoke db:test:prepare
** Execute test:integration
于 2009-07-31T05:58:52.880 に答える