こんにちは、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など) ファイル名
とすることで必要最低限のテンプレートが書かれた状態でファイルが生成出来る。
今回、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
参考サイト
- RailsにRSpecを導入する方法とやさしい解説 - Qiita
- 使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」 - Qiita
- 使えるRSpec入門・その2「使用頻度の高いマッチャを使いこなす」 - Qiita
- RSpec 3.4ではエラーが起きた行を出力結果に表示してくれるようになった - Qiita
まとめ
導入からテスト実行までの流れ
- Gem(rspec-rails)のbundle install
- 初期ファイルのインストール(rails generate rspec:install)
- テストしたいスペックの作成(rails g rspec:(model,controller,viewなど) ファイル名)
- 生成されたファイルを編集し、テストを作成
- テストを実行(rspec)
最後に
備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。