#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. Это происходит потому, что для строк, заключенных в одинарные кавычки, не выполняется интерполяция, поэтому они
#{}
воспринимаются буквально. При использовании сильных двойных кавычек произойдет интерполяция, и этот код будет работать.