Ruby / Rails

[Rails・Docker]初めてのRSpec

2019年9月6日

こんにちは、Nanayakuです。

今回は、Docker環境で自分が行ったRSpecの導入から実行までの流れを紹介します。

導入

Gemfileの「group :development, :test」に以下のGemを追加しました。

gem 'rspec-rails', '~> 3.8'

gem 'spring-commands-rspec'

「rspec-rails」は、RSpecの本体で自分はバージョン3.8を指定しました。

「spring-commands-rspec」は、設定を行えばRSpecを高速化(実行時間の短縮)する事ができます。

不要であれば、「rspec-rails」のみGemfileに追加します。

私はDockerで作成しているため、以下のコマンドでbundle installしました。

$ docker-compose up -d --build

その後、初期ファイルをインストールします。

$ docker-compose exec web rails generate rspec:install

実行後、以下の4つのファイルが作成されます。

メモ

作成した「.rspecファイル」は、rspecコマンドを実行した時に、このファイルに記入したオプションを自動で付与できます。

デフォルトでは「--require spec_helper」と言うオプションのみあります。

「--color」「--format documentation」を追記するとRSpec実行時、色付けされて見やすくなります。

 

実行

以下のコマンドでRSpecを実行する事ができます。(通常は$ rspecで実行できます)

$ docker-compose exec web rspec

テストを作成していないため、画像のように出力されます。

 

Springを使用

Spring を使ってRSpecを実行するために、以下のコマンドで「bin/rspecファイル」を作成しました。

$ docker-compose exec web bundle exec spring binstub rspec

ファイルの中身は以下のうようになっています。

これは、以下のコマンドで実行する事ができます。(通常はbin/rspec

$ docker-compose exec web bin/rspec

テストを作成していないので、上記の「$ docker-compose exec web rspec」と同じものが出力されます。

 

テストファイルの作成

以下の記事を参考に、テストファイルを作成しました。

RSpecではテストコードのことをスペックと言う。
例えばModelのテストコードはModelSpec、ControllerのテストコードはControllerSpecと呼ばれる。

それぞれのスペックのファイル名は、対象のファイル名_spec.rbと命名する。

Railsの場合、$rails g rspec:(model,controller,viewなど) ファイル名 とすることで必要最低限のテンプレートが書かれた状態でファイルが生成出来る。

RailsにRSpecを導入する方法とやさしい解説

今回、Userモデルの「name」の文字数制限についてのテストを作成していきます。

  validates :name, presence: true,
                   uniqueness: true,
                   length: { maximum: 15 }

今回テストするソースコード

下記のコマンドでUserモデルのテストを作成します。

$ docker-compose exec web rails g rspec:model user

作成されたファイルとその中身です。

 

テストを実行

文法は使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」 - Qiita、マッチャ(matcher)は使えるRSpec入門・その2「使用頻度の高いマッチャを使いこなす」 - Qiitaを参考にして「nameが15文字の場合はtureを返し、16文字の場合falseを返すテスト」を書いてみました。

 

require 'rails_helper'

RSpec.describe User, type: :model do
  describe 'name' do
    context '15文字の場合' do
      it 'tureを返す' do
        user = User.new(name: 'aaaaaaaaaaaaaaa', email: 'aaa@aaa.jp', password: 'example789', password_confirmation: 'example789')
        expect(user.save).to be_truthy
      end
    end
    context '16文字以上の場合' do
      it 'falseを返す' do
        user = User.new(name: 'aaaaaaaaaaaaaaaa', email: 'aaa@aaa.jp', password: 'example789', password_confirmation: 'example789')
        expect(user.save).to_not be_truthy
      end
    end
  end
end

今回は、試しにnameのテストを行ったので、beforeやletを使用していません。

テストの結果は画像のようになります。

RSpecは、テストでエラーが発生すると、下の画像のようにどこが悪いか教えてくれます。

このエラーは、「to_not」はsaveできないと言う意味でtureを返します。

「be_falsey」は、検証結果がfalseの場合パスを通すマッチャだったため、エラーが生じました。

パスを通すには、下記のようになります。

expect(user.save).to_not be_truthy
#または
expect(user.save).to be_falsey

 

参考サイト

 

まとめ

導入からテスト実行までの流れ

  1. Gem(rspec-rails)のbundle install
  2. 初期ファイルのインストール(rails generate rspec:install
  3. テストしたいスペックの作成(rails g rspec:(model,controller,viewなど) ファイル名)
  4. 生成されたファイルを編集し、テストを作成
  5. テストを実行(rspec)

 

最後に

備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。

-Ruby / Rails
-

© 2021 Nanayaku blog Powered by AFFINGER5