3

アプリケーション内で動的サブドメインを使用する機能を正常に追加しました。問題は、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

上記の制約で指定されたサブドメインクラスのこれまでのコードは次のとおりです。

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

上記のすべてのコードにより、ローカル ブラウザー内でサブドメインを正常に実行できます。Cucumber テストを実行すると、上記の問題が発生します。このテストでは、サインアップ ボタンをクリックすると、redirect_to が呼び出され、上記の例外がスローされます。

私の宝石ファイルは次のようになります。

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

私のテストを今すぐ機能させるための追加の方法を教えてください。修正、またはサブドメインを使用せずにメソッドをテストできる方法 (たとえば、アカウント名を取得するモックアウトされたメソッド) に興味があります。

4

1 に答える 1

1

私のコードにはこれと同じパターンがあります。私はカピバラを使用していますが(キュウリは使用していません)、次のように回避できました。

    # 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")

ザ・ホスト!コマンドは、テスト リクエストからアプリに表示されるホストを効果的に変更します。

編集: これは webrat では機能するが、カピバラでは機能しないことに気付きました (私は両方を使用しており、現在は webrat を段階的に廃止しています)。または:

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

編集:別の更新。すべてのイベントで完全な URL を使用しなくても機能する方法を見つけました。

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

テストセットアップで。

于 2011-09-02T17:22:35.713 に答える