Как перехватить перенаправления на другие домены при тестировании с помощью Webrat? - PullRequest
2 голосов
/ 19 декабря 2008

В моем приложении на Rails есть форма, перенаправляющая через сторонний сервис Amazon FPS. Форма отправляет действие в мое приложение, которое перенаправляет в Amazon, который собирает информацию и затем перенаправляет обратно в мое приложение.

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

Однако, когда Webrat отправляет форму, он вызывает ActionController::Integration::Session#request_via_redirect, который следует за всеми перенаправлениями, пока не получит ответ, который не является перенаправлением. Это включает в себя перенаправление на Amazon. Rails игнорирует домен и запрашивает путь у локального приложения, что не получается.

Я ищу способ запретить Webrat / Rails запрашивать URL-адреса в других доменах и разрешить мне проверить перенаправление.

1 Ответ

2 голосов
/ 19 декабря 2008

Решение: сделать свой собственный путь.

class ActionController::Integration::Session
  # Intercepts a request to a foreign domain.  Use this to stub
  # a service which the user is bounced through, such as an
  # OpenID provider.  The block should return a new URL to
  # request.  This is the URL which the foreign service would
  # redirect the browser to if we were really using it.
  # 
  # Currently, the return URL can only be requested with a GET.
  # 
  #   stub_request 'foreign.host.com' do |path|
  #     return_from_bounce_url
  #   end
  def stub_request(host, &block)
    @request_stubs ||= {}
    @request_stubs[host] = block
  end

  def process_with_stubs(method, path, parameters = nil, headers = nil)
    @request_stubs ||= {}

    if @request_stubs.key? self.host
      url = @request_stubs[host].call(path)
      process_without_stubs(method, url, parameters, headers)
    else
      process_without_stubs(method, path, parameters, headers)
    end
  end
  alias_method_chain :process, :stubs
end
...