在我的Rails应用程序中,我有一个通过外部服务Amazon FPS重定向的表单。表格POST到我的应用程序中的一个动作,该动作重定向到亚马逊,后者收集信息然后重定向回我的应用程序。
我正在使用Webrat测试此工作流程。显然我无法测试亚马逊,所以我想检查重定向到亚马逊的情况,然后模拟亚马逊重定向回我的应用程序,有效地模拟了亚马逊的测试。
但是,当Webrat提交表单时,它会调用ActionController::Integration::Session#request_via_redirect
,它会跟随所有重定向,直到获得不是重定向的响应。这包括重定向到亚马逊。 Rails忽略域并从本地应用程序请求路径,该路径失败。
我正在寻找的方法是阻止Webrat / Rails在其他域上请求URL并允许我验证重定向。
答案 0 :(得分:2)
解决方案:按自己的方式行事。
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