Настроить пользовательский агент для тестирования рельсов

Я разрабатываю приложение для iOS с использованием turbolinks-ios и варианта Rails.

В своем приложении для iOS я установил пользовательский агент iPadApp и обнаружил, что в Rails application controller использует request.user_agent.try(:index, 'iPadApp') для установки variant на tablet (потому что по представлениям похожи на foo.html+tablet.haml).

Мое приложение работает нормально, и теперь я пытаюсь написать тесты функций для своего приложения, но не могу правильно настроить пользовательский агент. Я попробовал это сообщение, которое на самом деле является stackoverflow, но я вижу, что он не устанавливает request.user_agent вместо (page.driver.browser.header(key, value)) параметра запроса set с in request.params.

В моем тесте контроллера я просто использую request.user_agent = 'iPadApp', чтобы настроить пользовательский агент, который работает нормально.

Как мне настроить запрос на тестирование, чтобы я мог использовать request.user_agent.try(:index, 'iPadApp')?

Спасибо за любую помощь.


person Engr. Hasanuzzaman Sumon    schedule 23.08.2016    source источник
comment
Какой драйвер вы используете с капибарой?   -  person Thomas Walpole    schedule 23.08.2016
comment
@TomWalpole Не указан явный драйвер. Поэтому я думаю, что он использует драйвер по умолчанию.   -  person Engr. Hasanuzzaman Sumon    schedule 23.08.2016


Ответы (3)


Поскольку вы не указываете драйвер, Capybara должна использовать rack_test. С помощью драйвера rak_test вы можете установить заголовок пользовательского агента в своем тестовом коде перед вызовом visit с помощью

page.driver.header('User-Agent', 'the user agent string you want')

Это должно сделать request.user_agent доступным в коде вашего приложения.

Другое решение - зарегистрировать конкретный драйвер для ваших тестов ipad.

Capybara.register_driver(:ipad_rack_test) do |app|
  Capybara::RackTest::Driver.new(app, :headers => { 'HTTP_USER_AGENT' => 'User agent string' })
end

а затем укажите свой драйвер как: ipad_rack_test

person Thomas Walpole    schedule 23.08.2016
comment
Ваше решение работает, хотя я обнаружил, что page.driver.header call page.driver.browser.header (исходный код) [github.com/jnicklas/capybara/blob/master/lib/capybara/rack_test/. Я не знаю, почему в прошлый день это не сработало (я просто перезапускаю свой сервер). Есть ли способ передать User-Agent в качестве атрибута в качестве опции метода visit? Таким образом, вместо установки заголовка перед каждым посещением a может передать эту опцию. Спасибо за вашу помощь. - person Engr. Hasanuzzaman Sumon; 24.08.2016
comment
Конечно, я могу переопределить метод visit, где я могу установить header в зависимости от передачи options. - person Engr. Hasanuzzaman Sumon; 24.08.2016
comment
Нет, нет возможности передать его для посещения, если вы не заблокируете visit себя. Более простым / чистым решением, вероятно, было бы просто поместить настройку заголовка в блок before, чтобы он запускался перед каждым тестом (или тестами, которые вы помечаете с помощью определенных метаданных) - person Thomas Walpole; 24.08.2016
comment
@ Engr.HasanuzzamanSumon Если вам это нужно для большого количества тестов, см. Раздел, который я добавил к ответу о регистрации драйвера специально для него. - person Thomas Walpole; 24.08.2016
comment
неопределенная локальная переменная или метод `page ' - person Eddie; 10.02.2018
comment
@Eddie Значит, вы не вызываете это в своем тестовом коде, о чем говорится в ответе, или вы неправильно установили Capybara для своих тестов. - person Thomas Walpole; 10.02.2018

Поскольку я не могу комментировать или редактировать, мне пришлось дать новый ответ. Хотя вышесказанное верно, для вершины, где у него page.driver.header('User-Agent', 'the user agent string you want'), мне пришлось использовать Capybara.page.driver.header('User-Agent', 'the user-agent string you want').

Надеюсь это поможет.

person Jay    schedule 27.03.2017

В дополнение к этому, если вы хотите настроить пользовательский агент для всего вашего тестирования. Вы можете сделать что-то подобное в разделе конфигурации spec_helper.rb (например, пользовательский агент Chrome)

config.before(:each) do
  Capybara.page.driver.header('user-agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36.')
end
person Andrew    schedule 08.05.2017