とあるプロダーツプレイヤーの徒然日記

とあるプロダーツプレイヤーが徒然なるままによしなし事をそこはかとなく書きつくろいます

PC用とスマートフォン用のRspecを書き分ける

概要

今時のwebサイトってPC用とスマートフォン用にUI作り分ける感じですよね?

ジョブメドレーでもjpmobile/jpmobile · GitHubを使って、PC用とスマートフォン用の画面を作り分けている。

そんな時に、featureテストを書くとしたら画面要素がそれぞれ違うので、テスト別々に書く必要がありますよね?

設定も含めて、どうやってPC用とスマートフォン用のテストをかき分けるかというお話です。

前提

  • gem 'jpmobile'を入れていること
  • include Jpmobile::ViewSelectorを読み込んでること
  • PC用とスマートフォン用のテンプレートを用意していること

Rspecの設定

まずは、スマートフォン用画面へ切り替えるため、user agentを偽装する関数を用意する

# spec/features/sample_spec.rb
module FeatureHelpers
  def switch_to_mobile
    user_agent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko)'
    user_agent += ' CriOS/38.0.2125.67 Mobile/12B411 Safari/600.1.4'
    page.driver.header('User-Agent', user_agent)
  end
end

これをrails_helperで読み込む(featureテストなのでtypeをfeatureにする)

  # spec/features/sample_spec.rb
  config.include FeatureSpecHelpers, type: :feature

肝心のfeatureテストの書き方

# spec/features/sample_spec.rb
require 'rails_helper'

RSpec.feature 'サンプルページ', type: :feature do
  context 'PC用' do
    it 'トップページ' do
      visit '/'
      expect(page).to have_content 'PC'
    end
  end
  context 'スマートフォン用' do
    before(:each) do
      switch_to_mobile
    end
    it 'トップページ' do
      visit '/'
      expect(page).to have_content 'スマートフォンー'
    end
  end
end

まとめ

下記のQiita記事のように他にも方法はあるっぽいが、 自分としては上記の方法が一番しっくりきたので、これで。

Rspecでjpmobileを利用したスマートフォンサイトのコントローラのテストをする方法 - Qiita