2009-03-01 6 views
39

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

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

ответ

23
@request.host = 'user.myapp.com' 
+17

'host! «user.myapp.com'' работал для меня – deb

+2

В спецификации контроллера я получаю сообщение об ошибке при попытке использовать' host! '. Установка '@ request.host', как и ответ, показала работу. –

+6

И как его использовать с RSpec? Я имею в виду, где его настроить? большое спасибо! – FRAGA

4

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

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

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

1

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

+2

Этот синтаксис не работал для меня. И принятый ответ тоже не принимался. Единственное, что работало в качестве хоста! («Newhostname.com»). – jeffarena

+1

Конечно, вам нужно поместить строку имени хоста в одинарные или двойные кавычки. – justingordon

2

Другое дело, чтобы помнить, чтобы убедиться, чтобы использовать экземплярправильно сеанса, так что вы можете правильно инкапсулировать URL-адрес хелперы.

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

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

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

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

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 
9

В спецификациях функций, хост! устарел. Добавьте их в свой 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 
+0

Примечание: Кажется, что 'Capybara.app_host' должен включить протокол. Например. '" http: //test.domain ", а не просто" test.domain ". – lime

+1

как включить порт? –

53

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

  • интеграции функции (наследующий ActionDispatch::IntegrationTest):

    host! "my.awesome.host" 
    

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

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

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

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

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

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

    От @AminAriana's answer

  • Посмотреть Спекуляции (наследующий ActionView::TestCase)

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

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

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

    См rspec-railsview spec docs.

+0

Благодаря рельсам 5 и переключению с «ActionController :: TestCase» на «ActionDispatch :: IntegrationTest» этот верхний «Интеграционные функции» неоценим для тех из нас, у которых есть многонаселенные приложения.Это был первый ответ, который показал, как получить '@ request.host' легко преобразованный в более старый набор (с помощью' host! '). Читая документы, это не выпрыгивало на меня, но мы здесь, и спасибо! – pjammer

1

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

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

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

Я бегу рубин 2.1.5p273, RSpec 3.1.7 и Rails 4.2.0

0

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

request.host = "user.myapp.com" 

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

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

Я лично предпочитаю гася над назначение, таким образом я получаю 2 выгоды, является то, что оно будет подтверждено Rspec Проверим двойной, второй в том, что он явно говорит, что это заглушка, а не часть тестового упражнения.

0

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

Capybara.configure { |config| config.default_host = "my.domain.com" } 

 Смежные вопросы

  • Нет связанных вопросов^_^