0
0

Everyday Rails - RSpecによるRailsテスト入門を読んで

Posted at

はじめに

Everyday Rails - RSpecによるRailsテスト入門を読了したので、良かった部分や学んだ部分についてまとめようと思います

良かったところ

  • 章の組み立てがわかりやすい
    • テストの内容・説明→まとめ→章末問題という流れ
    • 最初、基礎的なテストの仕方を説明して、後の章で今回言うとFactoryBotを使って説明していて理解しやすい
  • Rails5ではなくRails7で書かれていること
    • Ruby on Railsの教材の中でRails7の内容を書かれているものはあまり多くない印象です
    • 今後バージョンが上がった際も対応していただけそうな雰囲気を文章から感じました

学んだところ

RSpec のセットアップ

  • Gemfile

  •   group :development, :test do
    
      gem 'rspec-rails' #追加
      
      end
    

    に記述して bundle install実行

  • テストデータベース
    config/database.ymlを開き、どのデータベースにアクセスできるか確認

SQLiteなら

  •   test:
        <<: *default
        database: db/test.sqlite3
    

MySQL や PostgreSQLなら

  •   test:
        <<: *default
        database: projects_test
    

こうなっています

そしてbin/rails db:create:allを実行
すでに作成済みなら、rails タスクはテストデータベースがすでにあることを教えてくれる

RSpecをインストール
bin/rails generate rspec:install

意味のあるテストデータの作成

Factory Bot をインストールする
group :development, :test do
  gem "rspec-rails"
  gem "factory_bot_rails"

  # その他の gem は省略 ...
end

gemをインストールして例えば、Userモデルのファクトリを追加するときには

bin/rails g factory_bot:model user

このコマンドを実行すると、spec ディレクトリ内に factories という新しいディレクトリが
作られます。その中には users.rb という名前のファイルが作られます。

FactoryBot.define do
  factory :user do
    sequence(:user_name) { |n| "test_user#{n}" }
    sequence(:email) { |n| "test-#{n}@exmaple.com" }
    password { 'password' }
    password_confirmation { 'password' }
    phone { '09012345678' }
    birthdate { '2024-07-03' }
  end
end

そしてこのように記述してテスト内で

FactoryBot.create(:user)

と書くだけで、
簡単に新しいユーザーの作成ができます

ですが、FactoryBot.create(:user)を繰り返し使用すると
emailなどが同じになってしまいバリデーションエラーを起こします
なのでシーケンスを使ってユニークバリデーションを持つデータを生成して防ぎます

sequence(:user_name) { |n| "test_user#{n}" }
sequence(:email) { |n| "test-#{n}@exmaple.com" }

とすることでユニークなメールアドレスを生成することができます

Factory Botはごちゃごちゃしがちなスペックを綺麗にできる点が非常に便利に感じました

システムスペックで UI をテストする

  • 統合テストの一つとしてシステムスペックがある
  • 特にUIのテストとして有効
Capybara をインストールする
group :test do
  gem 'capybara'

  # その他の gem は省略 ...
end

リクエストスペックで API をテストする

  • リクエストスペックとシステムスペックの比較
    • リクエストスペックは高速で軽量なテストに適しており、主にサーバーサイドの動作やAPIのテストに使用されます。
    • システムスペックは現実的なユーザー体験をテストするのに適しており、フロントエンドの動作を含む複雑な操作をテストするのに使用されます。

スペックを DRY に保つ

let で遅延読み込みする
  • let は呼ばれたときに初めてデータを読み込む、遅延読み込みを実現するメソッド
    • beforeブロックの外部で呼ばれるため、セットアップに必要なテストの構造を減らすこともできる

テスト駆動開発に向けて

  1. 最初にテストを書く(Red)
  2. テストがパスするように最小限のコードを実装する(Green)
  3. 必要に応じてコードをリファクタリングする(Refactor)

RSpec は失敗した内容をわかりやすく表示してくれるため、テストは失敗すべきであるとも言えます。

難しかったこと

  • モックとスタブに関しての部分の理解
  • 実務でのテスト駆動開発をどう進めていくのか

さいごに

RSpecの知識を深めたい人には、まずはこれを読めば良いと進めたいぐらい本書は丁寧で読みやすかったです
まだまだ理解できていない部分もあるのでテストする際、都度読み返そうと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0