Как изменить домен по умолчанию "www.example.com" для тестирования в rails? - PullRequest
49 голосов
/ 01 марта 2009

У меня есть приложение rails, которое действует по-разному в зависимости от того, к какому домену оно обращалось (например, www.myapp.com по-разному будет вызывать user.myapp.com). В производственном использовании все это работает нормально, но мой тестовый код всегда видит имя хоста "www.example.com".

Есть ли чистый способ заставить тест указывать имя хоста, к которому он притворяется?

Ответы [ 10 ]

73 голосов
/ 13 марта 2015

Я думаю, что все ответы здесь неполные ... Чтобы перечислить все возможные случаи:

  • Спецификации интеграции (наследование от ActionDispatch::IntegrationTest):

    host! "my.awesome.host"
    

    См. документы , раздел 5.1 Помощники, доступные для интеграционных тестов .

  • Спецификации контроллера (наследуется от ActionController::TestCase)

    @request.host = 'my.awesome.host'
    

    См. документы , раздел 4.4 Доступные переменные экземпляра .

  • Характеристики (через Капибару)

    Capybara.default_host = "http://my.awesome.host"
    # Or to configure domain for route helpers:
    default_url_options[:host] = "my.awesome.host"
    

    С @ ответ Амин Арианы

  • Просмотр спецификаций (наследование от ActionView::TestCase)

    @request.host = 'my.awesome.host'
    

    ... или через RSpec:

    controller.request.host = "my.awesome.host"
    

    См. rspec-rails Просмотр документации по документации .

27 голосов
/ 01 марта 2009
@request.host = 'user.myapp.com'
12 голосов
/ 24 февраля 2015

В спецификации функций, хост! был объявлен устаревшим Добавьте их в свой rspec_helper.rb:

# Configure Capybara expected host
Capybara.app_host = <myhost>

# Configure actual routes host during test
before(:each) do
  default_url_options[:host] = <myhost>
end
5 голосов
/ 24 сентября 2013

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

Интеграционные тесты предоставляют вам сеанс по умолчанию. Вы можете вызвать все методы сеанса прямо из ваших тестов

test "should integrate well" do
  https!
  get users_path
  assert_response :success
end

Все эти помощники используют экземпляр сеанса по умолчанию, который, если не изменен, переходит на "www.example.com". Как уже упоминалось, хост можно изменить, выполнив host! ("My.new.host")

Если вы создаете несколько сеансов с использованием метода open_session, вы должны ВСЕГДА использовать этот экземпляр для вызова вспомогательных методов. Это будет правильно инкапсулировать запрос. В противном случае rails вызовет экземпляр сеанса по умолчанию, который может использовать другой хост:

test "should integrate well" do
  sess = open_session
  sess.host! "my.awesome.host"
  sess.get users_url             #=> WRONG! will use default session object to build url.
  sess.get sess.users_url        #=> Correctly invoking url writer from my custom session with new host.
  sess.assert_response :success
end

Если вы намеревались использовать объект сеанса по умолчанию, вам также придется изменить этот хост:

test "should integrate well" do
  sess = open_session
  sess.host! "my.awesome.host"
  host! sess.host              #=> Set default session host to my custom session host.
  sess.get users_url
end 
4 голосов
/ 05 апреля 2018

Для спецификации запроса Rspec используйте before(:each) { host! 'example.com' }

Подробнее на: https://relishapp.com/rspec/rspec-rails/v/3-6/docs/request-specs/request-spec https://github.com/rspec/rspec-rails/issues/1662#issuecomment-241201056

4 голосов
/ 01 марта 2009

Полагаю, вы можете изменить переменные среды HTTP_HOST или SERVER_NAME, чтобы изменить запрос к маршрутизатору:

ENV['SERVER_NAME'] = "user.myapp.com"

См. raw_host_with_port в actionpack / lib / action_controller / request.rb .

1 голос
/ 19 февраля 2018

Ни один из способов, предложенных в других ответах на данный момент, не работал для меня. Это сработало:

Capybara.configure { |config| config.default_host = "my.domain.com" }
1 голос
/ 08 апреля 2015

Я попробовал множество вариантов @request.host, host! и post path, args, {'SERVER_NAME' => my_secret_domain} безуспешно, как в тестах контроллера, так и в тестах функций. Очень обидно, так как многие другие сообщили об успехе с этими подходами.

Решение для меня было:

request.headers["SERVER_NAME"] = my_secret_domain
post path, args

Я использую ruby ​​2.1.5p273, rspec 3.1.7 и Rails 4.2.0

1 голос
/ 18 июня 2010

@request.host = 'user.myapp.com' не правильно. следует использовать host!('user.myapp.com')

0 голосов
/ 06 апреля 2017

Еще один ответ:

request.host = "user.myapp.com"

Я знаю, что это похоже на правильный ответ, но, пожалуйста, потерпите меня. Мне не нравится операция присваивания в тесте, просто чтобы настроить вещи, я бы предпочел явную заглушку. Интересно, что такая заглушка не будет работать:

allow(request).to receive(:host).and_return("user.myapp.com")

Лично я предпочитаю окурок, а не задание, таким образом я получаю 2 преимущества, во-первых, это будет подтверждено rspec-проверкой double , во-вторых, это явно говорит, что это заглушка, а не тестовое упражнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...