2013-07-15 6 views
0

Ruby Rails 애플리케이션에 대한 테스트를 작성하고 있으며 Ruby가 연결할 수없는 경우 Redis 서버가 던져 놓은 오류를 잡아 내야하는 코드 블록이 있습니다. 현재 코드는 다음과 같습니다Ruby rescue가 StandardError를 캐치하지 않습니다.

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 

내가 테스트를 실행하는 코드의 두 번째 줄 시도 스택 추적에 따르면 - config.before (모든) {...}를 - - 1 Redis :: CannotConnectError을 던집니다. "e.class.superclass.superclass ..."명령을 많이 수행 한 후에이 오류가 StandardError에서 상속 받았다고 결정했습니다.

그 후 나는 붙 잡혔다. "Rescue Redis :: CannotConnectError", "rescue"및 마침내 "Rescue Exception"오류를 잡으려고 시도했지만 여전히 오류가 발생합니다. 그러나 Ruby 명령 프롬프트에서 같은 것을 시도했는데 예외가 매회 잡혔습니다

아무도 나에게 무슨 일이 일어나는지 알아낼 수 있습니까? 감사!

+0

나는 그것이 루비의 문제를 생각하지 않습니다를? RSpec을 사용합니다. 맞습니까? –

답변

1

beforeafter으로 전달 된 블록은 정의 된 시점에 실행되고 있지 않습니다. 대신, 그들은 저장되어지고 나중에 각 spec 파일이 실행되기 전후에 Rspec에 의해 호출됩니다.

당신은 아마 대신 블록 내에서 시작/구조를 이동할 수 있습니다 :

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

# same for config.after(:all) 
+0

정말 고마워요! 그건 꽤 설명합니다 – NcAdams

+1

나는 'Exception'을 잡는 것에 대해주의 할 것입니다. 'StandardError'와 같은 것들도 있습니다. 잡는다면 여러분은 전혀 알지 못할 것입니다. – Hengjie