LoginSignup
1
1

More than 3 years have passed since last update.

Ruby on Rails のテストフレームワーク Rspec の導入

Last updated at Posted at 2020-06-06

テストとは

アプリケーションの様々な挙動を全て手動でチェックすることは困難です。
このため、テストを書くことによってデータの受け渡しが正しくされるか、想定した挙動で動いているかなど、効率的にチェックすることができます。

Ruby でのテストフレームワークと Rspec について

Rubyのテストフレームワークで有名なものは
- Rspec
- Test::Unit
- Cucumber
などがあります。この中で Rspec は一番使われているBDDテストフレームワークです。

テストの種類

Rails チュートリアルではいくつかの種類のテスト使われています。

モデルやビューヘルパー単体の動作をチェックする単体テスト、コントローラー/ビューの呼び出し結果をチェックする機能テスト、ユーザーの実際の操作を想定し、複数のコントローラーにまたがるアプリの挙動をチェックする統合テストがあり、システム開発では以上のテストを行うことが多いです。

導入

Gemfile に rspec に関する gem を入れます


group :development, :test do
  gem 'rspec-rails'
end

のあと、

$ bundle install

をしましょう。

必要に応じて、FactoryBot (旧FactoryGirl)なども入れましょう。
参考文献:https://qiita.com/at-946/items/aaff42e4a9c2e4dd58ed

文法

テストの要件の記述

describe , it , expect

これらを使うことによってテスト要件の記述ができます。

例えば単体テスト(modelのテスト)では、

spec/company_spec.rb

RSpec.describe Account, type: :model do
  describe 'company model' do
    it '作成' do
      expect { create(:company) }.to change { Company.count }.by(1)
    end
  end
end

Rspec でエラーが出た時には、context, it に記述した文章が出力されます。
これにより、どの部分でエラーが起きたのかを理解することができます。

context

context を使って条件を分岐しても良いです。it をそれぞれ作成してもよい
例えば controller のテストにおいては、

spec/company_spec.rb
RSpec.describe CompaniesController, type: :controller do
  describe '一覧の取得' do
    context 'ログインしている場合' do
      it '200 を返す' do
        // テスト処理
      end
    end
    context 'ログインしていない場合' do
      it '400 エラーを返す' do
        // テスト処理
      end
    end
  end
end

使い分け

区分 記述すること
describe テストの対象
context 特定の条件の場合分けを記述
it アウトプットが何かを記述

以上のように振る舞いを記述してから、テストを書いていきます。

let , let!

テストにおいて、テストデータを使う場合にはこのような処理を記述します。
例えば、

spec/company_spec.rb
RSpec.describe CompaniesController, type: :controller do
  describe '一覧の取得' do
    context 'ログインしている場合' do
      it '200 を返す' do
        let(:company) { Company.create(name: '株式会社ヤマダ', email: 'yamada@exapmle.com') }
        # テスト処理
      end
    end
    context 'ログインしていない場合' do
      it '400 エラーを返す' do
        # テスト処理
      end
    end
  end
end

以上のように処理を書く部分でデータを作成します。

let let! はそれぞれ

区分 評価タイミング
let 最初にメソッドが呼ばれた時に処理される
let! ブロック実行前に処理される

つまり、上の例だと

let(:company) { Company.new(name: '株式会社ヤマダ', email: 'yamada@exapmle.com') }

この時点では、:company が作られておらず、
例えば、

process :show, method: :get, params: { company_id: company.id }

のようにcompany が呼ばれた時点で、作成されるという違いがあります。

呼ばれるタイミングの違いでエラーが出ることがあるので、この違いは意識したいところです。

before / after

テストの前後に行いたい処理がある際にはこちらに処理を記述します。

Rspec で作成されたデータは基本的にテストが終わると、テスト用のデータベースから削除される。

終わりに

Rspec で個人的にごちゃっとするところをまとめてみたつもりです。
間違っている点があれば、ご指摘いただけるとありがたいです!

参考文献

https://qiita.com/jnchito/items/42193d066bd61c740612#context-%E3%81%A7%E6%9D%A1%E4%BB%B6%E5%88%A5%E3%81%AB%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%8C%96%E3%81%99%E3%82%8B
https://qiita.com/uchiko/items/d34c5d1298934252f58f

1
1
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
1
1