1

Ruby Rails アプリケーションのテストを作成しており、Ruby が接続できない場合に Redis サーバーによってスローされたエラーをキャッチするコード ブロックがあります。現在、コードは次のようになっています。

begin
    config.before(:all) { Resque.redis.select 1 }
    config.after(:all) { Resque.redis.keys("queue:*").each { |key| Resque.redis.del key } }
rescue Exception
    puts "RESCUED REDIS ERROR"
end

テストを実行しようとしたときのスタック トレースによると、そのコード スニペットの 2 行目 -- config.before(:all) {...} -- がRedis::CannotConnectErrorをスローします。多くの「e.class.superclass.superclass...」コマンドの後、このエラーは StandardError から継承されていると判断しました。

その後、行き詰まりました。「rescue Redis::CannotConnectError」、「rescue」、最後に「rescue Exception」でエラーをキャッチしようとしましたが、それでもエラーがスローされます。ただ、Rubyのコマンドプロンプトで同じことをやってみたところ、毎回例外がキャッチされました

ここで何が起こっているのかを理解するのを手伝ってくれる人はいますか? ありがとう!

4

1 に答える 1

1

問題は、渡されたブロックが定義された時点で実行されていないことですbeforeafter代わりに、それらは保存され、各スペックファイルが実行される前後に Rspec によって呼び出されます。

代わりに、begin/rescue をブロック内に移動することをお勧めします。

config.before(:all) do
  begin
    Resque.redis.select 1
  rescue Exception
    puts "RESCUED REDIS ERROR"
  end
end

# same for config.after(:all)
于 2013-07-15T17:26:57.317 に答える