Rails 4, Rspec и Factory Girl: URI ::InvalidURIError (мультитенантность)

#ruby-on-rails #ruby-on-rails-4 #rspec #factory-bot #multi-tenant

#ruby-on-rails #ruby-on-rails-4 #rspec #завод-бот #многопользовательский

Вопрос:

Я следую руководству по Rails 4 и Multitenancy, но получаю сообщение об ошибке при попытке проверить, может ли пользователь войти в систему как владелец и перенаправить на созданный поддомен.

Это тестовая ошибка:

 Failures:

  1) User sign in signs in as an account owner successfully
     Failure/Error: visit root_url

     URI::InvalidURIError:
       bad URI(is not URI?): http://#{account.subdomain}.example.com
     # /Users/developer/.rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara/rack_test/browser.rb:71:in `reset_host!'
     # /Users/developer/.rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara/rack_test/browser.rb:21:in `visit'
     # /Users/developer/.rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara/rack_test/driver.rb:43:in `visit'
     # /Users/developer/.rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara/session.rb:240:in `visit'
     # /Users/developer/.rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara/dsl.rb:52:in `block (2 levels) in <module:DSL>'
     # ./spec/features/users/sign_in_spec.rb:9:in `block (3 levels) in <top (required)>'

Finished in 0.56981 seconds (files took 1.26 seconds to load)
11 examples, 1 failure, 6 pending
  

Это тест:

 require "rails_helper"

feature "User sign in" do
  extend SubdomainHelpers

  let!(:account) { FactoryGirl.create(:account) }
  let(:sign_in_url) {"http://#{account.subdomain}.example.com/sign_in"}
  let(:root_url) {"http://#{account.subdomain}.example.com/"}

   within_account_subdomain do
     scenario "signs in as an account owner successfully" do
       visit root_url
       expect(page.current_url).to eq(sign_in_url)
       fill_in "Email", :with => account.owner.email
       fill_in "Password", :with => "password"
       click_button "Sign in"
       expect(page).to have_content("You are now signed in.")
       expect(page.current_url).to eq(root_url)
     end
   end
 end
  

Вот фабрики:

Учетная запись:

 FactoryGirl.define do
  factory :account, :class => Subscribe::Account do
    sequence(:name) { |n| "Test Account ##{n}" }
    sequence(:subdomain) { |n| "test#{n}" }
    association :owner, :factory => :user
  end
end
  

Пользователь:

 FactoryGirl.define do
  factory :user, :class => Subscribe::User do
    sequence(:email) { |n| "test#{n}@example.com" }
    password "password"
    password_confirmation "password"
  end
end
  

Я действительно не знаком с BDD, пожалуйста, дайте мне знать, если вам нужно, чтобы я опубликовал что-нибудь еще.

Ответ №1:

Итак, я решил это:

Проблема была в моем файле SubdomainHelpers

 module SubdomainHelpers
  def within_account_subdomain
    ### This Line Is the original line
    let(:subdomain_url) { 'http://#{account.subdomain}.example.com' }

    ### Changed it to this
    let(:subdomain_url) { "http://#{account.subdomain}.example.com" }

    before { Capybara.default_host = subdomain_url }
    after { Capybara.default_host = 'http://www.example.com' }
    yield
  end
end
  

По какой-то причине использование одинарных кавычек сохранялось account.subdomain как строка; как только я перешел на двойные кавычки, тест прошел!

Спасибо.

Комментарии:

1. Это происходит потому, что для строк, заключенных в одинарные кавычки, не выполняется интерполяция, поэтому они #{} воспринимаются буквально. При использовании сильных двойных кавычек произойдет интерполяция, и этот код будет работать.