🙆‍♀️

RSpec 設定

2021/06/19に公開

RSpec導入のための備忘録です。

Gemfile

Gemfile
source 'https://rubygems.org'
ruby '2.7.1'
gem 'rails', '6.0.3.1'

group :development, :test do
  gem 'factory_bot_rails'
end

group :test do
  gem 'capybara'
  gem 'selenium-webdriver'
  gem 'webdrivers'
  gem 'rspec-rails', '4.0.1'
end
$ bundle install
$ rm -rf ./test
$ rails g rspec:install
require_relative 'boot'
require 'rails/all'
Bundler.require(*Rails.groups)

module Taskleaf
  class Application < Rails::Application
    config.load_defaults 6.0

    config.generators do |g|
      g.test_framework :rspec,
                       fixtures: true,
                       view_specs: false,
                       helper_specs: false,
                       routing_specs: false,
                       controller_specs: false,
                       request_specs: true,
                       system_specs: true
    end
  end
end
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
require 'capybara/rspec'

RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :selenium_chrome_headless
  end
  
  # rspec-expectations config goes here. You can use an alternate
  # assertion/expectation library such as wrong or the stdlib/minitest
  # assertions if you prefer.
  config.expect_with :rspec do |expectations|
# コメントされているので、コメントを外す
# spec/support以下に、いろいろファイルを置けるようになる
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }


RSpec.configure do |config|
  # テスト中に、FactoryBot.create(:user) ではなく、create(:user) と書けるようになる。
  config.include FactoryBot::Syntax::Methods
end
module LoginSupport
  # 利用者がログインする
  def login_as(user)
    visit root_path
    click_link "Sign in"
    fill_in "Email", with: user.email
    fill_in "Password", with: user.password
    click_button "Log in"
  end
end

# RSpecの設定 LoginSupport をinclude
RSpec.configure do |config|
  config.include LoginSupport
end

RSpecのレポートを見やすく

.rspec
--require spec_helper
--format documentation

ファクトリ追加

rails g factory_bot:model user
FactoryBot.define do
  factory :user do
    name { '太郎' }
    sequence(:email) { |n| "user#{n}@example.com" } # 連番
    password { 'password' }
  end
end

スペック作成

$ rails g rspec:system users
$ rails g rspec:request users
$ rails g rspec:model users

参考

使い方

使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」
使えるRSpec入門・その2「使用頻度の高いマッチャを使いこなす」
使えるRSpec入門・その3「ゼロからわかるモックを使ったテストの書き方」
使えるRSpec入門・その4「どんなブラウザ操作も自由自在!逆引きCapybara大辞典」
rspec-rails 3.7の新機能!System Specを使ってみた

書籍

Everyday Rails - RSpecによるRailsテスト入門
Everyday Rails
現場で使える Ruby on Rails 5速習実践ガイド

Discussion