Rspecのgemを使ったRailsの自動テストについて
積極的にアウトプット!
ということで今回はRspecのgemを使った自動テストについて学習をしましたので、
それについてのアウトプットをしていきます。
はじめに
Rspecでは単体で動くプログラムが正常に動くのか、複数のプログラムが連動して正常に動くかということを自動でテストしてくれる機能になります。
Railsではgemを使って、実装し使っていくことになります。
今回はRailsで rspec-rails というgemを使ってテストしていきます。
Setting
まずはgemのインストール、bundle installを済ませましょう。
gem 'rspec-rails'
bundle install
次にRspecに必要な設定ファイルを用意します。
ターミナルで以下のコマンドを入力。
bundle exec rails g rspec:install
そうすると以下のようなフォルダ・ファイルが作成されます。
app/spec
app/spec/rails_helper.rb
app/spec/spec_helper.rb
.rspec
今後はこのspecのディレクトリ内にテストコードやそれを入れておくフォルダを作成していきます。
各ファイルの役割
上記コマンドで生成されたファイルの役割です。
rails_helper.rb
テストコードを書いたファイルに対して共通して使いたい設定やメソッドをここに記入します。
呼び出すときは、各々のファイルで require 'rails_helper' のように記載する。
spec_helper.rb
共通する設定やメソッドを書いておくというところは同じであるが、こちらはrailsを使用しないという違いがある。
railsの特殊な書き方はせず、Rspecの全体的な設定をかけるようです。
テスト結果の形式設定
次に.rspecファイルにテスト結果で返ってくる答えがどういう形式で返ってくるかを設定します。
記入の仕方は
--format progress
のように記載します。
この progress というところが指定する形式名になります。
種類として、
・ progress
・ documentation
・ html
・ json
があるようです。
何も設定として記載しなかった場合は、progressがデフォルトとして設定されています。
それぞれどのように返ってくるかは、詳しくまとめられている方がいらっしゃったので、
参考としてリンク貼っておきます。
http://samurai.ataglance.jp/rspec_format/
今回はdocumentationで指定していきます。
Test
では早速テストを行っていきます。
今回はモデルの一つのファイルに対して、単体テストを行いました。
テストを行う際はテストを行うそれぞれのフォルダを作成し、その中にテストコードを書くspecファイルを設置します。
コントローラーであれば、spec/controller
テストコードを書くspecファイルの命名には慣習があるようです。
対応するクラス名_spec.rb
今回はuserモデルのファイルでテストを起こっていくので画像のように作成しています。
require 'rails_helper'
describe User do
describe '#create' do
it "is invalid without a nickname" do
user = User.new(nickname: "", email: "", password: "00000000", password_confirmation: "00000000")
user.valid?
expect(user.errors[:nickname]).to include("can't be blank")
end
end
end
上記のように記載をしました。
これはニックネームカラムにデータが入っていなかったとき、ちゃんとエラーが出るかどうか
バリデーションが機能しているかどうかを確認するテストコードになっています。
require 'rails_helper' rails_helperで設定した共通設定を呼び出します。
describe 詳細名 do
・・・
end
テストのまとまりをグループ化します。
基本的に・・・の部分に処理を書いていきます。
上の例で行くと、userモデルの中のcreateというアクションに対するテストということになります。
it "testの説明" do
・・・
end
it doは一つのテストのかたまり(example)を表します。
一つのテストの処理をこの中に書いていきます。
expect(X).to eq(Y)
基本的なテストコードの書き方です。
エクスペクテーションという。
意味は、XとYが等しければテスト成功 という意味です。
一度試しに X 1+1 Y 1+1 の値はお互いに等しいかということをテスト実行してみると
のように返ってくる。
これはexample が1つ 、失敗は0 という内容です。
また、eqの部分はマッチャといい他にも種類がある。
include() ()内の値を含む場合、テスト成功。など
□他使用メソッド
valid? バリデーションによりデータが保存できない状態かを確認する true false で返す
errors 上記のようなメソッドを利用したインスタンスに対して原因がわかるようにする。
最後に テストを実行するときは
ターミナルで bundle exec rspec
以上