2012-01-05 2 views
1

이 같은 블록이 있습니다RSpec에 : 테스트 구조 블록

begin 
    response = Facebook.make_profile_request(params[:token]) 
rescue => e 
    Airbrake.notify(
    :error_class => "Facebook Processing", 
    :error_message => "Error: #{e.message}" 
    ) 

    flash[:notice] = "Uh oh...something went wrong. Please try again." 
    redirect_to root_path 
end 

이것은 내가 지금까지 무엇을 가지고 :

it "should notify Airbrake if call to FB fails" do 
    Facebook.stub(:make_profile_request).with(fb_token).and_raise(Exception) 
    Airbrake.should_receive(:notify) 
    get :facebook_process, token: fb_token 
end 

나는 오류 얻을 :

1) UsersController GET facebook_process should notify Airbrake if call to FB fails 
Failure/Error: get :facebook_process, token: fb_token 
Exception: 
    Exception 
# ./app/controllers/users_controller.rb:9:in `facebook_process' 
# ./spec/controllers/users_controller_spec.rb:41:in `block (3 levels) in <top (required)>' 

방법이해야 나는 구조를 제대로 테스트합니까?

+0

테스트 스텁의 예외를'RuntimeError'와 같은 것으로 변경합니다.'rescue '는 그것을 잡아 내지 못하기 때문입니다. –

답변

0

나는 최근에 비슷한 문제에 직면 해있다. 당신이

rescue Exception => e 

에 코드

rescue => e 

을 변경하는 경우

테스트 케이스는 통과합니다.

+5

이것은 나쁜 아이디어입니다 : http://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby – Nick

+0

당신이 생각하는 나쁜 생각이다 당신의 대답으로 좋은 아이디어를주기를 환영합니다. –

+0

불행히도 나는 답변을 가지고 있지 않습니다. 이것이 내가 해결책을 찾기 위해 여기에 도착한 방법입니다. 즉, 비록 내가 그 해답을 갖고 있지는 않지만 나쁜 행동을하는 독자들에게 경고하는 것은 가치있는 일이다. – Nick

0

특정 예외 클래스를 지정해야합니다. 그렇지 않으면 rspec은 예외를 감지하자마자 보류 상태가됩니다. 하지만, 여기에 당신이 Exception에서 구출하지 않고 그것을 할 수있는 방법이 있습니다 (Nick의 코멘트에서 지적한 바와 같이).

class MyCustomError < StandardError; end 

begin 
    response = Facebook.make_profile_request(params[:token]) 
rescue MyCustomError => e 
    ... 
end 

그리고 스펙에서 사용자 정의 오류 클래스를 반환하도록 설정해야합니다. 다음과 같은 것 :

Facebook.stub(:make_profile_request).with(fb_token).and_raise(MyCustomError) 
+1

또한 사용자 정의 오류 클래스를 반환하려면 스텁을 변경해야합니다. – zetetic

+0

rspec-mocks의 'stub'을 사용하여 구문을 명시 적으로 활성화하지 않고 'old': should'구문을 사용하지 마십시오. 새로운': expect' 구문을 사용하거나 명시 적으로 ': should'를 사용하도록 설정하십시오. – Ziggy