2012-01-05 18 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 => e 

rescue Exception => 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 

そして、あなたの仕様では、カスタムエラークラスをスタブに戻すようにしてください。

+1

カスタムエラークラスを返すには、スタブを変更する必要があります。 – zetetic

+0

rspec-mocksの 'stub'を使用して、古い':should'構文を明示的に有効化せずに使用することは推奨されていません。新しい ':expect'構文を使うか、明示的に':should'を有効にしてください。 – Ziggy

関連する問題