2008-12-19 4 views
2

Dans mon application Rails, j'ai un formulaire qui redirige via un service étranger, Amazon FPS. Le formulaire POST à ​​une action dans mon application qui redirige vers Amazon, qui collecte des informations et redirige ensuite vers mon application.Comment intercepter des redirections vers d'autres domaines lors de tests avec Webrat?

Je suis en train de tester ce workflow avec Webrat. Évidemment, je ne peux pas tester Amazon, donc je veux vérifier que la redirection vers Amazon arrive et ensuite simuler la redirection d'Amazon dans mon application, en se moquant effectivement Amazon du test.

Toutefois, lorsque Webrat soumet le formulaire, il appelle ActionController::Integration::Session#request_via_redirect, qui suit toutes les redirections jusqu'à ce qu'il obtienne une réponse qui n'est pas une redirection. Cela inclut la redirection vers Amazon. Rails ignore le domaine et demande le chemin à partir de l'application locale, qui échoue. Ce que je recherche est un moyen d'arrêter Webrat/Rails de faire des demandes d'URL sur d'autres domaines et de me permettre de vérifier la redirection.

Répondre

2

Solution: faites mon propre chemin.

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 
Questions connexes