Rspecの環境構築から必須のgemの解説と

 

 

どうもどハマりエンジニアです。

ここ最近は仕事等が忙しく更新出来ませんでしたが、仕事も落ち着いてきたので本日からまたしっかりと更新できるように頑張りたいと思います。

 

       目次
  • Rspecの環境構築
  • gem(factory_bot_rails や capybara)
  • モデルスペック
  • システムスペック

 

 

環境構築

gemの追加(capybaraやwebdriverなど必要なgemも追加しておく) 

 

Gemfile

group :development, :test do
  gem 'rspec-rails', '~> 3.8'
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'factory_bot_rails'
end

 

group :test do
  gem 'capybara'
  gem 'webdriver'
end

 

 

 スペックディレクトリ等を作成

$ bundle exec rails g rspec:install

create .rspec

create spec
create spec/spec_helper.rb

create spec/rails_helper.rb 

 

 

RSpec の出力をデフォルトの形式から読みやすいドキュメント形式へ

.rspec

--require spec_helper

--format documentation

これによってテストスイートの実行中にどのスペックがパスし、どのスペ ックが失敗したのかがわかりやすくなります。それだけでなく、スペックのアウトラインが美しく出力されます。

 

 

generateコマンドで一緒にスペックファイルも作成

 rails generate コマンドを使ってアプリケーションにコードを追加 する際に、RSpec 用のスペックファイルも一緒に作ってもらうよう Rails を設定しましょう。

 

config/application.rb

config.generators do |g|
 
g.test_framework :rspec,
           view_specs: false,
           helper_specs: false,
           routing_specs: false,
           controller_specs: false,
           model_specs: true,
           request_specs: false,
           fixtures: true
g.fixture_replacement :factory_bot, dir: 'spec/factories'

 

view_specs: false はビュースペックを作成しないことを指定します。代わりに システムスペック で UI をテストします。

helper_specs: false はヘルパーファイル用のスペックを作成しないことを指定します。ヘルパー ファイルは Rails がコントローラごとに作成するファイルです。RSpec を自在に操れるようになって きたら、このオプションを true にしてヘルパーファイルをテストするようにしても良いでしょう。

routing_specs: false config/routes.rb 用のスペックファイルの作成を省略します。シンプルなら、このスペックを作らなくても 問題ないと思います。しかし、アプリケーションが大きくなってルーティングが複雑になってきた ら、ルーティングスペックを導入するのは良い考えです。

モデルスペックとコントローラスペックの定型コードはデフォルトで自動的に作成されます。

 

 

spec/support配下のファイルを読み込む

 

rails_helper.rb 

Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }

 

上記の一文がコメントアウトされているので、コメントアウトを外してください。これでspec/support/配下のファイルを読み込むことができます。 

 

 

capybaraの設定

ブラウザの操作をシミュレートするために Capybara を使います。Capybara を 使うとリンクをクリックしたり、Web フォームを入力したり、画面の表示を検証したりすることができます。

Capybara は大変便利なRuby ライブラリで、フィーチャスペックのステップを定義したり、アプリケーションの実際の使われ方をシミュレートしたりするのに役立ちます。

これまでに見てきた gem とは異なり、Capybara には Rails の開発環境で実行可能なジェネレータ は用意されていません。Capybara をテスト環境に だけ 追加することにより、開発環境のメモリ消費を 少し軽くすることができます。次に、テストスイートに対して Capybara を読み込むように伝えなければ行けません。rails_helper を開き、Capybara のライブラリを 追加してください(訳注: 最後の行に require 'capybara/rspec' を追加しています)。

 

 

FactoryBotの設定について

 

rails_helper.rb

RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods


FactoryBotメソッドを使用する際に短縮して書くことができます。

 # 通常FactoryBotをつけないと、メソッドを呼べない
 user = FactoryBot.create(:user)
 # 上の設定を追加することで、FactoryBotの記述が省略できる。
 user = create(:user)

 

 

 連番を持ったデータを生成する(sequence)

sequence(:email) { |n| "tester#{n}@example.com" }

 

 

モデルスペック

 $ rails g rspec:model task (設定していない場合)

spec/models/task_spec.rbが作成されます

 

マッチャmatcher)は「期待値と実際の値を比較して、一致した(もしくは一致しなかった)という結果を返すオブジェクト」のことです。

 

specモデルの書き方
spec/models/task_spec.rb

it 'is invalid without title' do
  task = build(:task, title: '')
  expect(task).to be_invalid
  expect(task.errors.messages[:title]).to include("can't be blank")
end
本来ならエラーメッセージを出す時には、task.valid? といったようなコードを書く必要がありますが、今回はexpect(task).to be_invalid といったように記載しているので、今回は書く必要がありません。
 

 

 

 システムスペックの設定
 
 
System Specを配置するspec/systemディレクトリを作ります。
$ rails generate rspec:system task 
 
spec/support/driver_setting.rb
RSpec.configure do |config|
  config.before(:each, type: :system) do
 # driven_by(:rack_test) 
  # driven_by(:selenium_chrome)
  driven_by(:selenium_chrome_headless)
  end
end
 

 

 

mudule macrosを使ってログインとログアウトを実行するマクロを使えるようにします。 

module LoginMacros
  def login(user)
    visit login_path
    fill_in 'Email', with: 'user.email'
    fill_in 'Password', with: 'password'
    click_button 'Login'
    expect(page).to have_content 'Login successful'
  end

  def logout
    click_link 'Logout'
    expect(page).to have_content 'Logged out'
  end
end

rails_helper.rb

config.include LoginMacros

 spec/system/user_spec.rb

before { login(user) }

 

 

以上がRspecを使う上で必要となる設定についてです。