Модульное тестирование метода контроллера, который вызывается через пользовательский маршрут - PullRequest
0 голосов
/ 13 июня 2011

Как выполнить модульное тестирование метода контроллера, который вызывается по пользовательскому маршруту?

Соответствующий маршрут:

/auth/:provider/callback(.:format) {:controller=>"sessions", :action=>"create"}

В спецификации для SessionsController я не могу просто использовать get :create, так как этот маршрут не существует. Если я также использую get /auth/facebook/callback/, это скажет мне, что No route matches {:controller=>"sessions", :action=>"/auth/facebook/callback"}.

Также кажется, что я не могу просто использовать controller.create, поскольку #create получает доступ к некоторым ключам из хэша request, и он также перенаправляет на другой путь, даже если я установил request.env ['кое-что'] в файл спецификации.

1 Ответ

1 голос
/ 13 июня 2011

Функциональный тест должен проверять функцию каждого действия (дан набор параметров)

Важно, чтобы ваши функциональные тесты были отделены от маршрутов. (иначе какой смысл в абстракции маршрутизации в любом случае)

В test :: unit функциональный тест выглядит примерно так

test "#{action_name} - does something" do
  #{http_verb} :#{action_name}, :params => {:their => "values"}
  assert_response :#{expected_response}
end

Обратите внимание, мы нигде не упоминаем маршрутизацию.

Так что реальный пример для вашего создания

test "create - creates a session" do
  get :create, :provider => "your provider"
  assert_response :success
end

Rails захлебнется, если не сможет найти маршрут к этому запросу.

Если это не работает, я предлагаю вам проверить две вещи

  1. "get" - это правильный http глагол
  2. в вашем маршруте нет других обязательных параметров (я вижу: поставщик один)

Если я делаю что-нибудь дурацкое с маршрутизацией, Я обычно добавляю отдельный тест.

test "create - routing" do
  assert_recognizes({
    :controller => "sessions",
    :action => "create",
    :provider => "yourProvider"
    }, "/auth/yourProvider/callback")
end

Пока это соответствует вашему действию все должно быть хорошо.

...