2011-10-25 1 views
4

우선, 외부 API 호출을 조롱하는 것이 대부분의 경우에 올바른 일임에 동의합니다. 그러나이 경우에는 아닙니다.Timeout :: Error가 발생하면 자동으로 rspec 예제를 다시 실행하십시오.

일부 테스트에서 예외적 인 Timeout::Error이 발생하고이를 무시하고 자동으로 예제를 다시 실행하고 싶습니다. 실패는 10 번의 실패한 시도 후에 만보고되어야합니다.

기타 예외 & 오류가보고되어야합니다.

내가 spec/spec_helper.rb 파일에 글로벌 around(:each) 후크를 사용하여이 동작을 구현하기 위해 노력했습니다 :

RSpec.configure do |config| 
    config.around(:each) do |example| 
    attempts = 0 
    passed = false 

    begin 
     attempts +=1 
     example.run 
     passed = true 

    rescue Timeout::Error => e 
     raise e if attempts >= 10 

    end until passed 
    end 
end 

그러나 예외가 발생했을 때 구조 부분이 실행되지 없구요. 왜 그런가?

감사합니다. 도리안

P. rspec 2.6.0을 사용하고 있습니다.

답변

7

전파하지 않기 때문에 around 블록에서 예외를 구출 할 수 없습니다. 당신이 절대적으로 해야 다시 실행 예를 실패하는 경우, 당신은 여기처럼 @example에서 현재 예외를 꺼낼 수 있습니다 : 그것은 꽤 불쾌한 보이는

https://github.com/jnicklas/capybara/blob/c21d5eb2375b610ac13f54cf240e59c80918a2f1/spec/spec_helper.rb#L16

. 우리의 변명은 상류 도서관의 버그 였지만, 가능하다면 나는 이것을 피할 것입니다.

1

로깅에 대한 예외에 액세스하는 방법으로 @ Jo의 대답을 사용했습니다.

우리는 RSpec을 2.99로 업그레이드 할 때까지 (3.0으로 이동하는 관점에서) 큰 도움이되었습니다. 인스턴스 변수 @exception은 더 이상 주위 후크에있는 예제 개체에 없습니다.

전후 후크로 전환하고 후크의 예 :에서 이전과 같이 예외에 액세스해야했습니다.

config.after(:each) do |example| 
    exception = example.instance_variable_get('@exception') 
    # .... 
end 

재시도를 시도하지 않았으므로 RSpec 3.0에서 어떻게 달성 할 것인지 확신 할 수 없습니다.