yujiroのプログラミング

勉強内容をアウトプットし、サボらないようにする為のブログ

<DAY91>Rspecについて

\ Follow me!! /

f:id:yujiro0320:20190512223713p:plain


#学習状況

●学習日数 91日 

●学習時間(本日)9.5時間

●累計学習時間 373時間

●一日あたりの平均学習時間 4.16時間 

はじめに

学習カリュキラムである、Rspecの説明がクソ分かりにくくて、引いた。
TECH:EXPRARTは基礎カリュキラムは分かりやすいが、応用カリュキラムは手抜き感が目立つ。
基礎カリュキラムまでは返金対応可にしているのも理由な気がする。
残念。伊藤さんの記事が分かりやすいので、共有します。
qiita.com

railsRspecを使ってみる

gemの導入。併用して使う gemの'web-console'はtest環境ではバグ発生する可能性があるので、
develpemt環境でのみ使用するように合わせてgroupを組んでおく。

development環境のみで使用

group :development do

  gem 'rspec-rails'
  gem 'web-console', '>= 3.3.0'
end

developmentとtestで使えるようにしとく

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

bundle install

 rails g rspec:install

#生成されるファイル
create  .rspec
create  spec
create  spec/spec_helper.rb
create  spec/rails_helper.rb

helper.rbは共通の設定を記入したファイル
rails_helper.rbも同じだが、rails以外で使用する場合のファイル
railsで使うかどうかの違いでお作法を記入するファイルを変更させる。

ターミナルの表示を綺麗にするオプションを .rspecに記入する。


--format documentation

RSpecディレクトリの構造

大きくモデルとコントローラに分かれる。
specファイルは対応するクラス名_spec.rbとの命名規則に留意。

f:id:yujiro0320:20190521160711p:plain

記法について

条件式を加えない場合、型だけを見てみる

require 'rails_helper'

describe '' do
 it '' do
  except(X).to eq Y
  end
 end
end


describeはテスト全体の範囲を決めたもの
it '' doで囲んである実際に動作するテストのまとまりを示した部分をexampleと呼ぶ.
実際に評価される except(X).to eq Yの部分をエクスペクテーションと呼ぶ。
エクスペクテーションの文法の中で、eqに当たる、テストの条件を示したとこをマチャと呼びます。

参考文献
qiita.com

マチャについて

マチャ 効果 備考
include exceptの値が入っているかどうかチェック 引数にとった値がexpectの引数である配列に含まれているかをチェックすることができる
render_template 引数に指定したアクションが実行された時自動的に返すビューを指定する どんなアクションが来ても対応できる
be_valid validateが通っているかどうか かなり使うらしい
match(tweets) 引数に配列クラスのインスタンスをとり、expectの引数と比較するマッチャです。配列の中身の順番までチェックします。 ""

他にも参考として
note.mu

メソッド

メソッド 効果 備考
httpメソッド パラメータを指定する get, post, delete, patchがある。
assigns(:tweet) "" ""
create_list factory_botの設定ファイルに存在しているリソースを複数作成したい場合に以下のように利用できます。 ""
user.valid? バリデーションの結果を取得 ture falseで返す
user.errors エラーの中身を取得 valid?と併用する事でデフォルトでエラー時生成された文言を取得できる
response 異動先ビューの情報を持つインスタンス example内でリクエストが行われた後の遷移先のビューの情報を持つインスタンスです。

条件式を加えた式

require 'rails_helper'

describe 'userクラスの中で' do
  describe 'createアクションの' do
    it "バリデーションが実行された時に" do
      user = build(:user)
      expect(user).to be_valid
    end
 end
end

テスト実行

全体実行
bundle exec rspec  

ファイル指定
bundle exec rspec spec/models/users_spec.rb

FactoryBotについて

テストの度にテストデーターを生成するのを短縮する為にあるgemファイル。
データベースとのやり取りを確認するモデルのテストの際に、効率よくテストコードが書ける優れもの。
gemの導入から、使用方法までを記載する。

gem 'factory_bot_rails'

すでに導入しているgemファイルのgem 'rspec-rails'と同じグループ内で記述。

作成するディレクト

specディレクトリ直下にfactoriesディレクトリを生成。
ファイル名は生成したインスタンス変数の複数形(見やすいようにするルール)
userインスタンスを生成するので、ファイル名はusers.rbとしている。
f:id:yujiro0320:20190521160711p:plain

ファイル記載

FactoryBot.define do <----> end<---->に対象のモデル(クラス名)と生成するインスタンスと条件を指定

FactoryBot.define do
 factory :tweet do
   nickname                 {"abe"}
   email                     {"kkk@gmail.com"}
   password                 {"00000000"}
   password_confirmation {"00000000"}
 end
end

これで準備完了。生成したインスタンスを簡単なメソッドで呼び出す事ができます。

呼び出せるメソッド

buildメソッド

呼び出したいrspec.rbファイルにて以下のように呼び出しが可能

user = FactoryBot.build(:user) 
createメソッド

bulidと同じ動きですが、DBに保存するのがcreateです。ただ、実行されたテストを終了すると、
データーは保存されていません。

user = FactoryBot.build(:user) 
呼び出し記述の短縮

呼び出し時のFactoryBotの記述ですが、めんどくさいので、短縮できるように設定します。

rails_helper.rbのファイルに下記内容を追加します。

RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

コントローラでテストするにあたり

gemの導入

場所はtest develoment

gem 'rails-controller-testing'

モデルとの違い

記法はほぼ一緒。
HTTPメソッドを使用し、擬似的にリクエストを飛ばす。
この部分の記法が異なる程度。

describe ◯◯Controller do
  describe 'GET #show' do
    it "renders the :show template" do
      get :show, params: {  id: 1 }
    end
  end
end

Faker

emailや電話番号、名前などのダミーデータを作成するためのGem。
test環境のみに

 gem 'faker'

Fakerの使用例

  created_at { Faker::Time.between(2.days.ago, Time.now, :all) }
 sequence(:email)      {Faker::Internet.email}

最後に

書いて覚えていくしかない!