Как я могу проверить только часть URL, на который я перенаправлен (используя assert_redirected_to)? - PullRequest
14 голосов
/ 08 января 2010

В функциональном тесте моего приложения на Rails я хочу проверить, куда я перенаправлен. Ожидаемый URL-адрес указывает на внешний ресурс (это означает, что он не является частью моего приложения).

URL выглядит следующим образом: https://my.url.com/foo?bar1=xyz&bar2=123

К сожалению, я не могу предсказать параметры, потому что они генерируются внешним ресурсом. *
Однако остальная часть URL-адреса всегда остается неизменной: https://my.url.com/foo

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

Может кто-нибудь придумать другой способ проверить это перенаправление, но проверить только первую часть URL-адреса без параметров?

(URL не находится в assigns хэше)

* (я выполняю API-вызов приложения, который отвечает URL-адресом, который я перенаправлю на)

Ответы [ 4 ]

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

Команды http-запроса, такие как post, get и т. Д., Создают переменную экземпляра с именем @response, когда они вызываются *.@response сам содержит метод с именем redirect_url, в котором хранится URL-адрес, на который вы были перенаправлены (в случае, если вы действительно были перенаправлены).

Поэтому для сравнения я могу использовать обычный assert_matchрегулярное выражение для @response.redirect_url:

post :my_action_to_test
assert_response :redirect
assert_match /https:\/\/my.url.com\/foo/, @response.redirect_url

* (на самом деле эти методы http просто используют закрытый метод process, который создает переменную @response).

2 голосов
/ 08 января 2010

Две быстрые мысли об этом:

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

2) Если ваш функциональный тест на самом деле не подключается к внешнему приложению, то вы все равно имитируете его, поэтому я бы просто пропустил тестирование URL-адреса перенаправления и просто проверил перенаправление с помощью assert_response: redirect. Или создайте макет, который возвращает URL для перенаправления, как если бы это было внешнее приложение, но сделайте это так, чтобы вы могли получить из него параметры.

Тем не менее, не стоит так увлекаться тестами, что вы чувствуете, что должны охватить все возможные сценарии.

1 голос
/ 08 января 2010

Как насчет этого? Он включает assert_redirected_to, чтобы разрешить Regexp в качестве первого аргумента. Это не сработает, если вы попытаетесь сопоставить Regexp с Hash - только с String. Для этого потребуется немного больше работы.

ActionController::TestCase.class_eval do

  old_assert_redirected_to = method(:assert_redirected_to)

  define_method(:assert_redirected_to) do |*args|
    if args.[0].kind_of?(Regexp)
      assert_response(:redirect, args[1])
      assert args[0] === @response.redirected_to
    else
      old_assert_redirected_to.bind(self).call(*args)
    end
  end

end
0 голосов
/ 15 сентября 2016

Я использую следующий метод, чтобы игнорировать любые параметры строки запроса. Он основан на официальной реализации assert_redirected_to

# ignores any query string params eg. notice or alert messages for flash
def custom_assert_redirected_to(path)
  assert_response :redirect

  if path === Regexp
    url = path
  else
    url = ActionController::Redirecting._compute_redirect_to_location(@request, path)
  end

  assert_equal url, @response.location.split("?").first
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...