De acuerdo, esto es lo que debería ser un truco de Capybara bastante sencillo y fácil de entender que produzca el comportamiento deseado, es decir, poder crear una nueva sesión cada vez que cambie de subdominios. Esto es útil para sitios donde un usuario se registra en un dominio (lo que da como resultado la creación de un subdominio para su cuenta) y luego necesita navegar hacia ese subdominio.
Antes que nada (y esta parte es bastante común para las otras soluciones que existen), siga adelante y descubra cómo cambiar Capybara.default_host en un paso de Cucumber. Lo hice así:
Then /^I switch the subdomain to (\w+)$/ do |s|
Capybara.default_host = "#{s}.smackaho.st"
end
palillo de este paso en su función de pepino en el punto donde desea que el nuevo subdominio que desea utilizar. Por ejemplo:
When I open the email
Then I should see "http://acme.rightbonus.com/users/confirmation" in the email body
Given I switch the subdomain to acme
When I follow "Click here to finish setting up your account" in the email
Then I should be on the user confirmation page for acme
Ahora para el monkeypatching mágico que hace que esto funcione. Básicamente, desea que Capybara sea lo suficientemente inteligente como para detectar cuándo el subdominio ha cambiado y restablecer su objeto de sesión RackTest.
# features/support/capybara.rb
class Capybara::Driver::RackTest
# keep track of the default host you started with
def initialize(app)
raise ArgumentError,
"rack-test requires a rack application, but none was given" unless app
@app = app
@default_host = Capybara.default_host
end
def process(method, path, attributes = {})
reset_if_host_has_changed
path = ["http://", @default_host, path].join
return if path.gsub(/^#{request_path}/, '') =~ /^#/
path = request_path + path if path =~ /^\?/
send(method, to_binary(path), to_binary(attributes), env)
follow_redirects!
end
private
def build_rack_mock_session # :nodoc:
puts "building a new Rack::MockSession for " + Capybara.default_host
Rack::MockSession.new(app, Capybara.default_host || "www.example.com")
end
def reset_if_host_has_changed
if @default_host != Capybara.default_host
reset! # clears the existing MockSession
@default_host = Capybara.default_host
end
end
end
Este parche funciona con Capybara 0.4.1.1 y probablemente no funcione con diferentes versiones a menos que se modifique. Buena suerte.
Sí! Solución interesante Pero tiene un problema. Si utilizo "muéstrame la página", obtuve: esperado: "/ admin/companies", got: "/ home/user/webdev/project/public/admin/companies" (utilizando ==) (RSpec :: Expectations :: ExpectationNotMetError) – petRUShka
¿Y cuál es la descripción del paso "Entonces debería estar en la página de confirmación de usuario para acme"? – petRUShka