Проблемы с использованием поддоменов с Cucumber / Capybara - PullRequest
3 голосов
/ 27 октября 2010

Я успешно добавил возможность использования динамических поддоменов в моем приложении.Проблема в том, что когда я запускаю свои тесты Cucumber, я получаю следующую ошибку, когда мое приложение выполняет redirect_to, который содержит поддомен:

features/step_definitions/web_steps.rb:27
the scheme http does not accept registry part: test_url.example.com (or bad hostname?)

У меня есть действие контроллера регистрации, которое создает пользователя и выбранную учетную записьи перенаправляет пользователя к методу выхода из системы с указанием субдомена на основе того, что пользователь выбрал в качестве субдомена в форме регистрации.Вот код для действия перенаправления, которое происходит после создания и сохранения моделей пользователей и учетных записей:

redirect_to :controller => "sessions", :action => "destroy", :subdomain => @account.site_address

Вот мои рельсы 3 маршрута:

constraints(Subdomain) do
  resources :sessions
  match 'login', :to => 'sessions#new', :as => :login
  match 'logout', :to => 'sessions#destroy', :as => :logout
  match '/' => 'accounts#show'
end

Вот кодЯ до сих пор для класса Subdomain, который указан в ограничении выше:

class Subdomain
  def self.matches?(request)
    request.subdomain.present? && request.subdomain != "www"
  end
end

Я добавил UrlHelper к ApplicationController:

class ApplicationController < ActionController::Base
  include UrlHelper
  protect_from_forgery
end

Это код для вышеупомянутого класса UrlHelper:

module UrlHelper
  def with_subdomain(subdomain)
    subdomain = (subdomain || "")
    subdomain += "." unless subdomain.empty?
    [subdomain, request.domain, request.port_string].join
  end

  def url_for(options = nil)
    if options.kind_of?(Hash) && options.has_key?(:subdomain)
      options[:host] = with_subdomain(options.delete(:subdomain))
    end
    super
  end
end

Весь этот код выше позволяет мне нормально работать с поддоменами в локальном браузере.Проблема выше возникает, когда я запускаю тест на огурец.Тест нажимает кнопку регистрации, которая, в свою очередь, вызывает redirect_to и выдает исключение, перечисленное выше.

Вот как выглядит мой gem-файл:

require 'subdomain'

SomeApp::Application.routes.draw do

  resources :accounts, :only => [:new, :create]
  match 'signup', :to => 'accounts#new'

  constraints(Subdomain) do
    resources :sessions
    match 'login', :to => 'sessions#new', :as => :login
    match 'logout', :to => 'sessions#destroy', :as => :logout

    match '/' => 'accounts#show'
  end
end

Не могли бы вы сообщить об этом?дополнительный метод, чтобы мои тесты работали сейчас?Меня может заинтересовать исправление или способ проверки моих методов без использования поддоменов (например, метод с вычеркнутым именем, который извлекает имя учетной записи).

1 Ответ

1 голос
/ 02 сентября 2011

У меня такой же шаблон в моем коде.Я использую капибару (но не огурец), и я смог обойти это так:

    # user creates an account that will have a new subdomain
    click_button "Get Started"  
    host! "testyco.myapp.com"

    # user is now visiting app on new subdomain
    visit "/register/get_started/" + Resetkey.first.resetkey
    assert_contain("Get Started Guide")

Хост!Команда эффективно изменяет хост, как он выглядит для приложения из тестового запроса.

РЕДАКТИРОВАТЬ: только что понял, что это работает с вебратом, но не капибара (я использую оба, постепенно прекращая вебрат.)Я делаю это в капибаре, чтобы либо щелкнуть ссылку на новый домен (за ним следует капибара), либо:

 visit "http://testyco.myapp.com/register"

РЕДАКТИРОВАТЬ: еще одно обновление.Найден метод, который работает без использования полного URL-адреса в каждом событии.

        host! "test.hiringthing.com"
        Capybara.app_host = "http://test.hiringthing.com"

В настройках теста.

...