Rails устанавливает субдомен rspec

Я использую rSpec для тестирования своего приложения. В моем контроллере приложений у меня есть такой метод:

def set_current_account
  @current_account ||= Account.find_by_subdomain(request.subdomains.first)
end

Можно ли установить request.subdomain в моей спецификации? Может быть, в блоке before? Я новичок в rSpec, поэтому буду благодарен за любой совет по этому поводу.

Эф


person RailsSon    schedule 31.03.2010    source источник


Ответы (4)


Я понял, как решить эту проблему.

В моем блоке before в моих спецификациях я просто добавил:

before(:each) do
  @request.host = "#{mock_subdomain}.example.com"
end

Это настраивает request.subdomains.first как значение mock_subdomain.

Надеюсь, кто-то найдет это полезным, так как это не очень хорошо объяснено нигде в сети.

person RailsSon    schedule 01.04.2010
comment
один маленький совет — запрос доступен как метод, так и как переменная экземпляра. Вероятно, лучше получить доступ к нему через метод, чтобы держать небольшую дистанцию ​​между вами и базовым кодом RSpec. - person pat; 03.08.2010
comment
@лулалала request.host = "#{mock_subdomain}.example.com" - person alf; 15.08.2012
comment
Это не работает со мной. Я также добавил свой субдомен, api, в /etc/hosts как таковой: api.example.com, и я все еще получаю ошибку отсутствия маршрута. Любые идеи? - person darksky; 18.07.2013
comment
Также я работаю на Rails 3. - person darksky; 18.07.2013
comment
Убедитесь, что вы НЕ делаете «request.host». Для правильной работы это должна быть переменная экземпляра '@request.host'. - person nfriend21; 19.08.2013
comment
Для Спецификаций функций с Capybara используйте Capybara.default_host, как отметил Крис Питерс ниже. - person mltsy; 04.02.2017

Я знаю, что это относительно старый вопрос, но я обнаружил, что это зависит от того, какой тест вы выполняете. Я также использую 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
person Chris Peters    schedule 23.05.2015

В 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
person ilpoldo    schedule 01.12.2010
comment
Независимо от того, является ли это официальным способом сделать это в Rails 3, добавление хоста непосредственно к пути, как продемонстрировал ilpoldo, сработало для меня. - person Jeff Poulton; 15.11.2011
comment
Это не работает в спецификациях контроллеров. Вы не можете сделать get "path". Он будет интерпретировать это как действие. Вы должны сделать get :action_name только по какой-то причине. - person darksky; 18.07.2013
comment
Да, приведенный выше фрагмент из спецификации запроса. - person ilpoldo; 22.07.2013
comment
В контроллере я бы, вероятно, попытался использовать маршрутизатор, чтобы передать субдомен в качестве параметра контроллеру, а затем использовать что-то вроде get :index, :user='ilpoldo' в спецификации контроллера. Я не уверен, поможет ли это, но у меня есть этот пример: gist.github.com/ilpoldo /6052044. - person ilpoldo; 22.07.2013

  • Рспец - 3.6.0
  • Капибара — 2.15.1

Ответ Криса Питерса работал у меня для спецификаций запроса, но для спецификаций функций мне пришлось внести следующие изменения:

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
person mridula    schedule 01.12.2017