<DAY91>Rspecについて
#学習状況
●学習日数 91日
●学習時間(本日)9.5時間
●累計学習時間 373時間
●一日あたりの平均学習時間 4.16時間
- はじめに
- railsでRspecを使ってみる
- ターミナルの表示を綺麗にするオプションを .rspecに記入する。
- RSpec用ディレクトリの構造
- 記法について
- マチャについて
- メソッド
- 条件式を加えた式
- テスト実行
- FactoryBotについて
- コントローラでテストするにあたり
- Faker
- 最後に
はじめに
学習カリュキラムである、Rspecの説明がクソ分かりにくくて、引いた。
TECH:EXPRARTは基礎カリュキラムは分かりやすいが、応用カリュキラムは手抜き感が目立つ。
基礎カリュキラムまでは返金対応可にしているのも理由な気がする。
残念。伊藤さんの記事が分かりやすいので、共有します。
qiita.com
railsでRspecを使ってみる
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
記法について
条件式を加えない場合、型だけを見てみる
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としている。
ファイル記載
FactoryBot.define do <----> end<---->に対象のモデル(クラス名)と生成するインスタンスと条件を指定
FactoryBot.define do factory :tweet do nickname {"abe"} email {"kkk@gmail.com"} password {"00000000"} password_confirmation {"00000000"} end end
これで準備完了。生成したインスタンスを簡単なメソッドで呼び出す事ができます。
呼び出せるメソッド
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}
最後に
書いて覚えていくしかない!