Rails rspec set subdomain - PullRequest
       16

Rails rspec set subdomain

56 голосов
/ 01 апреля 2010

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

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

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

Eef

Ответы [ 4 ]

87 голосов
/ 01 апреля 2010

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

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

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

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

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

41 голосов
/ 23 мая 2015

Я знаю, что это довольно старый вопрос, но я обнаружил, что это зависит от того, какой тест вы проводите. Я также использую Rails 4 и RSpec 3.2, поэтому я уверен, что некоторые вещи изменились с тех пор, как был задан этот вопрос.

Технические характеристики запроса

before { host! "#{mock_subdomain}.example.com" }

Характеристики с капибарой

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
8 голосов
/ 01 декабря 2010

В 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
1 голос
/ 01 декабря 2017
  • Rspec - 3.6.0
  • Капибара - 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...