Рельсы rspec устанавливают субдомен
Я использую rSpec для тестирования моего приложения. В моем контроллере приложений у меня есть такой способ:
def set_current_account
@current_account ||= Account.find_by_subdomain(request.subdomains.first)
end
Можно ли установить request.subdomain в моей спецификации? Может быть, в предыдущем блоке? Я новичок в rSpec, поэтому любые советы по этому поводу будут очень благодарны.
Eef
Ответы
Ответ 1
Я выяснил, как сортировать эту проблему.
В моем предыдущем блоке в моих спецификациях я просто добавил:
before(:each) do
@request.host = "#{mock_subdomain}.example.com"
end
Это настраивает request.subdomains.first значение mock_subdomain.
Надеюсь, что кто-то найдет это полезным, поскольку его не очень хорошо объяснили в другом месте в сети.
Ответ 2
Я знаю, что это относительно старый вопрос, но я обнаружил, что это зависит от того, какой тест вы используете. Я также запускаю Rails 4 и RSpec 3.2, поэтому я уверен, что некоторые вещи изменились с тех пор, как был задан этот вопрос.
Спецификации запросов
before { host! "#{mock_subdomain}.example.com" }
Характеристики функций с Capybara
before { Capybara.default_host = "http://#{mock_subdomain}.example.com" }
after { Capybara.default_host = "http://www.example.com" }
Я обычно создаю модули в spec/support
, которые выглядят примерно так:
# spec/support/feature_subdomain_helpers.rb
module FeatureSubdomainHelpers
# Sets Capybara to use a given subdomain.
def within_subdomain(subdomain)
before { Capybara.default_host = "http://#{subdomain}.example.com" }
after { Capybara.default_host = "http://www.example.com" }
yield
end
end
# spec/support/request_subdomain_helpers.rb
module RequestSubdomainHelpers
# Sets host to use a given subdomain.
def within_subdomain(subdomain)
before { host! "#{subdomain}.example.com" }
after { host! "www.example.com" }
yield
end
end
Включить в spec/rails_helper.rb
:
RSpec.configure do |config|
# ...
# Extensions
config.extend FeatureSubdomainHelpers, type: :feature
config.extend RequestSubdomainHelpers, type: :request
end
Затем вы можете вызвать в своей спецификации так:
feature 'Admin signs in' do
given!(:admin) { FactoryGirl.create(:user, :admin) }
within_subdomain :admin do
scenario 'with valid credentials' do
# ...
end
scenario 'with invalid password' do
# ...
end
end
end
Ответ 3
В rails 3 все, что я попытался вручную установить на хост, не сработало, но, глядя на код, я заметил, насколько красиво они проанализировали путь, который вы передаете помощникам запроса, например get
.
Конечно, если ваш контроллер идет и выбирает пользователя, упомянутого в субдомене, и сохраняет его как @king_of_the_castle
it "fetches the user of the subomain" do
get "http://#{mock_subdomain}.example.com/rest_of_the_path"
assigns[:king_of_the_castle].should eql(User.find_by_name mock_subdomain)
end
Ответ 4
- Rspec - 3.6.0
- Capybara - 2.15.1
Ответ Криса Петерса работал у меня для спецификаций Request, но для спецификаций Feature мне пришлось внести следующие изменения:
rails_helper:
Capybara.app_host = 'http://lvh.me'
Capybara.always_include_port = true
feature_subdomain_helpers:
module FeatureSubdomainHelpers
def within_subdomain(subdomain)
before { Capybara.app_host = "http://#{subdomain}.lvh.me" }
after { Capybara.app_host = "http://lvh.me" }
yield
end
end