Rspec: тестовый спасательный блок - PullRequest
1 голос
/ 05 января 2012

У меня есть такой блок:

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)>'

Какя должен правильно проверить спасение?

Ответы [ 2 ]

0 голосов
/ 03 июня 2015

Вы должны указать конкретный класс исключений, в противном случае rspec выполнит запрос, как только обнаружит исключение; но вот как вы можете сделать это, не спасаясь от Исключения (как указано в комментарии Ника).

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)
0 голосов
/ 09 января 2012

Я недавно сталкивался с подобной проблемой.

если вы измените свой код

rescue => e

на

rescue Exception => e

, ваш тестовый пример пройдет.

...