Rails RSpec set поддомен


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

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

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

Eef

4   51   2010-04-01 01:32:35

4 ответа:

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

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

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

это настройка запроса.подобласти.сначала должно быть значение mock_subdomain.

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

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

в 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
  • Rspec-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