Rspec для обнаружения устройств - PullRequest
0 голосов
/ 28 февраля 2019

Это моя задача

1) Создать новый маршрут localhost: 3000 / device

2) Подумайте, был ли этот URL получен с мобильных телефонов или настольных браузеров, тогда

3) Отслеживание системы / устройства (iOS, android, web), с которого был получен URL-адрес

4) В зависимости от устройства, с которого поступил запрос, нам нужно перенаправить на другой URL-адрес(например, iOS ——> «iOS app store», android ——> «Android play store», web ——> «страница Google»)

5) Узнайте, какие существуют различные подходы, доступные дляотслеживать систему, из которой поступил запрос, и что было бы лучше всего реализовать и почему?

Здесь я нашел решение, но в rspec оно вызывает ошибку.

Это мой маршрут

get :devise, to: 'topics#devise'

А это мой контроллер

class TopicsController < ApplicationController
  def devise
    if request.env['HTTP_USER_AGENT'].downcase.match(/mac/i)
      redirect_to 'https://itunes.apple.com/us/app/apple-store/id375380948?mt=8'
    elsif request.env['HTTP_USER_AGENT'].downcase.match(/windows/i)
      redirect_to 'https://www.microsoft.com/en-in/store/apps/windows'
    elsif request.env['HTTP_USER_AGENT'].downcase.match(/android/i)
      redirect_to 'https://play.google.com/store?hl=en'
    else
      redirect_to root_path
    end
  end
end

Когда я нажимаю url lvh.me:3000/devise, он перенаправляется в соответствующий магазин приложений.

Это моя спецификация контроллера

context 'devise' do
  it 'should detect the device' do
    get :devise
    response.should redirect_to '/https://www.microsoft.com/en-in/store/apps/windows'
  end 
end

и это вызвало ошибку:

Ожидаемый ответбыть перенаправлением на http://test.host/https://www.microsoft.com/en-in/store/apps/windows, но было перенаправлением на http://test.host/.
Ожидается, что http://test.host/https://www.microsoft.com/en-in/store/apps/windows" будет === "http://test.host/".

Если я сделал это неправильно, скажите несколько советов для rspec

1 Ответ

0 голосов
/ 28 февраля 2019

Если ваша версия rails не слишком древняя в контроллере, вы можете использовать request.user_agent (она все равно заглядывает в env, но это делает код чище)

Браузеры передают пользовательский агент в заголовок User-agent (которыйв свою очередь заканчивается в стойке env), поэтому вам нужно смоделировать это в своих тестах.

Для тестирования я бы рекомендовал использовать спецификации запросов вместо контроллеров (которые не рекомендуются в rails 5):

 RSpec.describe 'Topics...', type: :request do
   it "redirects for ios" do
     get '/your/topcis/path/here', headers: { 'HTTP_USER_AGENT' => 'iPhone' }
     expect(response).to redirect_to(/\.apple\.com/)
   end
 end

(выше используются rails 5, для старых rails заголовки будут просто хэшем, а не аргументом ключевого слова)

Также вы можете написать свой метод с помощью оператора case:

def devise
  redirect_to case request.user_agent.downcase
              when /mac/i     then 'https://itunes.apple.com/us/app/apple-store/id375380948?mt=8'
              when /windows/i then 'https://www.microsoft.com/en-in/store/apps/windows'
              when /android/i then 'https://play.google.com/store?hl=en'
              else
                root_path
              end
end
...