Действие контроллера-заглушки в тесте контроллера Rspec, но оно все еще выполняется - PullRequest
4 голосов
/ 05 марта 2011

Я хотел бы проверить, действительно ли вызывается действие контроллера без перенаправления в некоторый before_filter. Поскольку само действие контроллера может выполнять перенаправление, я хочу заблокировать действие, чтобы вызвать конкретную ошибку (SuccessfulActionError или аналогичная), а затем проверить эту ошибку как индикатор того, что метод был вызван.

Итак, я добавил следующее:

controller.stub!(:action).and_raise(SuccessfulActionError)

Это работает как-то , исключение вызывается, но фактический код в методе все еще выполняется (например, если я отправляю идентификатор несуществующей записи в действие 'show' , он генерирует исключение ActiveRecord :: RecordNotFound).

Почему это? Я хочу полностью заглушить действие, как если бы оно было реализовано как

def action
  raise SuccessfulActionError
end

Что я делаю не так? Это неправильный подход?

EDIT:

Использование

controller.should_receive(:action)

тоже не работает.

Я перезаписываю контроллер в фильтре before_all, как это, чтобы исправить default_url_options, которые не подобраны из ApplicationController:

class MyController
  def default_url_options(options = {})
    { :locale => params[:locale] }
  end
end

Может ли это быть виновником? Спецификации не работают вообще, когда я удаляю это, к сожалению.

1 Ответ

0 голосов
/ 06 марта 2011

Мне не понятно, как можно получить исключение ActiveRecord :: RecordNotFound после того, как заглушить метод. Заглушка должна заменить вызов метода.

В качестве альтернативного подхода вы могли бы рассмотреть возможность установки ожидаемого сообщения для действия, например

controller.should_receive(:show)
get :show

, который должен завершиться неудачей, если before_filter предотвращает вызов действия.

...