Как отключить обработчики восстановления в приложениях Ruby on Rails, когда я выполняю функциональные тесты? - PullRequest
5 голосов
/ 07 мая 2009

У меня есть несколько контроллеров в моих приложениях на Ruby on Rails с обработчиком спасения в конце действия, которое в основном перехватывает любые необработанные ошибки и возвращает какую-то «дружественную пользователю» ошибку. Тем не менее, когда я делаю тест рейка, я бы хотел отключить эти обработчики по умолчанию, чтобы я мог видеть полную ошибку и трассировку стека. Есть ли какой-нибудь автоматизированный способ сделать это?

Обновление для уточнения: у меня есть подобное действие:

def foo
  # do some stuff...
rescue
  render :text => "Exception: #{$!}" # this could be any kind of custom render
end

Теперь, когда я проверю это, если будет сгенерировано исключение, я собираюсь получить немного информации об этом исключении, но мне бы хотелось, чтобы оно действовало так, как будто там нет обработчика спасения. , поэтому я получаю полную отладочную информацию.

Обновление: РЕШЕНИЕ

Я сделал это:

  rescue:
    raise unless Rails.env.production?
    render :text => "Exception: #{$!}" # this could be any kind of custom render
  end

Ответы [ 5 ]

9 голосов
/ 11 января 2010

Не совсем автоматизировано, но как изменить код, чтобы он перебрасывал исключения при вызове в тесте?

Возможно, что-то вроде этого:

def foo
  # do some stuff...
rescue
  raise if ENV["RAILS_ENV"] == "test"
  render :text => "Exception: #{$!}" # this could be any kind of custom render
end
0 голосов
/ 21 августа 2009

Я думаю, что самое простое, что нужно сделать, это убедиться, что был вызван правильный рендер - или что-то отличное от обычного, не исключительного случая.

0 голосов
/ 07 мая 2009

Какой метод вы используете? В ActionController есть два метода восстановления.

У меня есть это в моем базовом контроллере:

def rescue_action_in_public(exception)
    response_code = response_code_for_rescue(exception)
    status = interpret_status(response_code)
    respond_to do |format|
        format.html { render_optional_error_file response_code}
        format.js { render :update, :status => status  do |page| page.redirect_to(:url => error_page_url(status)) end}
end

конец

Отображает только пользовательские ошибки в рабочем режиме.

0 голосов
/ 13 мая 2009

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

Например:

def test_throws_exception
  assert_raise Exception do
    raise_if_true(true)
  end
end
0 голосов
/ 07 мая 2009

Вы смотрели на использование вызова assert_raise( exception1, exception2, ... ) { block } и затем печатали исключение из блока?

...