Рельсы 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