Как я могу проверить общее поведение контроллера Rails, оставаясь сухим? - PullRequest
1 голос
/ 19 августа 2010

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

То, что я хотел бы видеть, - это однострочные сопоставления для фильтров и макетов, аналогичные сопоставлениям и проверкам в случае использования Ifa.К сожалению, такие сопоставления отсутствуют (за исключением некоторых макросов Test :: Unit для фильтров в этом сообщении в блоге ).Я испытываю желание просто написать их сам, но неспособность найти кого-то, кто уже сделал это, заставляет меня задаться вопросом, существует ли на самом деле необходимость в таких сопоставителях.

Так что мой вопрос, как вы проверяетеобычное поведение ваших контроллеров (если вы вообще его тестируете), и будут ли полезны однострочные сопоставители, тестирующие фильтры и макеты?Сам я пытаюсь выбирать между однострочными спецификациями контроллеров в сочетании с явной спецификацией фильтра или просто спецификацией фильтра и игнорированием фильтров и макетов в контроллерах (так как они в любом случае только одна строка кода).

1 Ответ

0 голосов
/ 19 августа 2010

Мне не нравится идея написания спецификаций для фильтров - это кажется слишком близким к реализации. Если бы вы использовали методы TDD / BDD для создания контроллера с нуля, вероятно, вы сначала написали бы действие, добавили некоторую логику (например, для обработки аутентификации) и затем поняли, что вместо этого он должен войти в фильтр. Если ваша спецификация похожа на «Отклонить запрос на индекс, если текущий пользователь не является пользователем учетной записи», ваша спецификация должна быть в состоянии сделать что-то вроде (aircode) :

current_user = Factory.create(:unauthorized)
controller.should_not receive(:index)
get :index
request.should redirect_to(some_safe_path)

И не имеет значения, использует ли действие фильтр или нет.

Вы можете высушить спецификации контроллера с помощью макросов Rspec. Итак (больше размахивать руками) :

describe MyController do
  should_reject_anonymous(self)
  ...
end

module ControllerMacros
  def should_reject_anonymous(test_controller)
    describe test_controller, "Authentication" do
      it "rejects index" do
        test_controller.should_not_receive(:index)
        get :index
        response.should redirect_to(some_safe_path)
      end
    end
  end
end
...